docs(e2e): предупреждение о конкуренции за recognition.result

e2e подписывается на реальный recognition.result в queue group arm-core: другой экземпляр ядра (контейнер arm-core
профиля services, локальный сервер с NATS_ENABLED=true) заберёт часть ack/результатов. README и docstring теста
требуют остановить такие экземпляры; комментарий: MATCH достигается по имени (ИНН в шапке нет).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
Andrey Epifancev 2026-10-05 23:58:16 +04:00
parent f361fae79b
commit 96525f1ace
2 changed files with 11 additions and 0 deletions

View File

@ -544,6 +544,12 @@ docker compose -f ../docs/dev/docker-compose.yml -p arm-ka --profile services st
Образ собирается из `../tabular-parser` (main соседнего репозитория workspace).
**Перед e2e остановите другие экземпляры ядра, подписанные на `recognition.result`** (контейнер `arm-core` из профиля
`services`, локальный `make run`/`run_server.py` с `NATS_ENABLED=true`): тест подписывается на реальный subject в боевой
queue group `arm-core`, подписчики группы получают сообщения по очереди (round-robin), и ack/результат парсера уйдут
чужому экземпляру (он отбросит их как `unknown_job`, у него другая БД) — тест упадёт по таймауту 60 с. Поднимайте только
`tabular-parser` (`--no-deps`), как в команде выше.
### Проверка ORM и DBML
Модель данных — `../docs/model/data-model-v5.15.dbml`. ORM обязана совпадать с ней один в один:

View File

@ -5,6 +5,10 @@
tabular-parser (читает файл из MinIO, пишет результат в MinIO) → inbox (ack, результат) → цикл маппинга → файл
`PROCESSED`, документ и строки ОСВ. Предусловие — профиль `services` (`tests/e2e/conftest.py`); иначе тест пропускается.
Очистка: `DELETE /files/{id}` через API и удаление временной БД (фикстура `committed_sessionmaker`).
ВНИМАНИЕ: приложение подписывается на реальный `recognition.result` в боевой queue group `arm-core`; если в это время
работает другой экземпляр ядра (контейнер `arm-core` профиля `services`, локальный сервер с `NATS_ENABLED=true`),
часть ack/результатов уйдёт ему и тест упадёт по таймауту. Перед прогоном остановите такие экземпляры (README).
"""
import asyncio
@ -135,6 +139,7 @@ async def test_real_osv_is_parsed_end_to_end(
(brief,) = card["documents"]
assert (brief["document_type"], brief["osv_account_code"]) == ("OSV", "66")
assert (brief["period_year"], brief["period_quarter"], brief["is_cumulative"]) == (2024, "Q4", True)
# MATCH достигается именно по имени: ИНН в шапке ОСВ нет (D-8), имя ЮЛ совпадает с шапкой
assert brief["counterparty_check"] == "MATCH"
assert brief["status"] == "RECOGNIZED"