From 96525f1aceb695867483a1b776beae0f0dff9c5c Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Mon, 5 Oct 2026 23:58:16 +0400 Subject: [PATCH] =?UTF-8?q?docs(e2e):=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=20recognition.result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit e2e подписывается на реальный recognition.result в queue group arm-core: другой экземпляр ядра (контейнер arm-core профиля services, локальный сервер с NATS_ENABLED=true) заберёт часть ack/результатов. README и docstring теста требуют остановить такие экземпляры; комментарий: MATCH достигается по имени (ИНН в шапке нет). Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- README.md | 6 ++++++ api/tests/e2e/test_osv_ingest_e2e.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 660d3cb..e36c995 100644 --- a/README.md +++ b/README.md @@ -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 обязана совпадать с ней один в один: diff --git a/api/tests/e2e/test_osv_ingest_e2e.py b/api/tests/e2e/test_osv_ingest_e2e.py index 62d7e78..500a28f 100644 --- a/api/tests/e2e/test_osv_ingest_e2e.py +++ b/api/tests/e2e/test_osv_ingest_e2e.py @@ -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"