From 9a1584281dfb09350304ca1a12a0c9c59bf69be5 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 6 Nov 2026 11:34:58 +0400 Subject: [PATCH] =?UTF-8?q?fix(#190):=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=209=20=E2=80=94=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=BE=D0=B2=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D1=83=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=20?= =?UTF-8?q?=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=201/2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ревью фикс-раунда 1: у old_file в обоих тестах был только один документ (account="62"), ключ которого не совпадал ни с одним документом нового файла (account="60") — _replaceable не находила совпадений, file_ids оставался пустым, и supersede_previous возвращала [] на раннем `if not file_ids: return []`, до locked/хука. Тесты не проверяли SUPERSEDED/SUPERSEDED_AFTER_CONFIRM, а падали бы с NoResultFound при реальном прогоне. Добавлен документ account="60" в old_file каждого теста — триггер замены файла; account="62" остаётся выпавшим документом, на котором проверяется факт исхода. Co-Authored-By: Claude Sonnet 5 --- api/tests/test_result_mapping.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/api/tests/test_result_mapping.py b/api/tests/test_result_mapping.py index 9708bdb..ea00a6b 100644 --- a/api/tests/test_result_mapping.py +++ b/api/tests/test_result_mapping.py @@ -1555,13 +1555,21 @@ async def test_supersede_previous_writes_superseded_fact_for_dropped_document( committed_sessionmaker: async_sessionmaker[AsyncSession], ): """Задача 9 (Review Focus докс-плана): документ, выпавший из автозамены (ключа нет среди документов нового - файла — OQ-154), не подтверждавшийся (`NEEDS_CHECK`) — факт исхода `SUPERSEDED`, без причины (вне матрицы §6).""" + файла — OQ-154), не подтверждавшийся (`NEEDS_CHECK`) — факт исхода `SUPERSEDED`, без причины (вне матрицы §6). + + Фикс-раунд 1 ревью задачи 9: у `old_file` ОБЯЗАТЕЛЬНО должен быть документ, совпадающий по ключу с документом нового + файла (здесь — `old_60`/`new_60`, оба account="60") — иначе `_replaceable` не находит ни одного совпадения, + `file_ids` остаётся пустым, и `supersede_previous` возвращает `[]` на раннем `if not file_ids: return []` + ДО того, как доходит до `locked`/хука: файл не заменяется вовсе, и `_outcome_fact` на `old_62` упал бы с + `NoResultFound`. `old_60` сам не проверяется в этом тесте — он лишь триггер замены файла; выпавший документ + для assert — `old_62` (account="62", ключа которого нет среди документов нового файла).""" maker = committed_sessionmaker async with maker() as session, session.begin(): entity = await make_legal_entity(session, name=OWNER_NAME, inn="7700000001") old_file, old_job = await make_stored_file( session, entity=entity, status=FileStatus.PROCESSED, job_status=RecognitionStatus.done ) + await make_document(session, file=old_file, job=old_job, account="60") # триггер замены (совпадает по ключу) old_62 = await make_document( session, file=old_file, job=old_job, account="62", status=DocumentStatus.NEEDS_CHECK ) @@ -1590,7 +1598,12 @@ async def test_supersede_previous_writes_superseded_after_confirm_for_confirmed_ ): """Задача 9: автозамена подтверждённого документа — в отличие от удаления (задача 8), здесь нет 409-проверки, блокирующей вручную подтверждённые документы, замена их не исключает. `confirmed_by` факта — из документа - (может быть не NULL, читается как есть, не считается всегда системным).""" + (может быть не NULL, читается как есть, не считается всегда системным). + + Фикс-раунд 1 ревью задачи 9: как и в тесте выше, `old_file` должен иметь документ, совпадающий по ключу с документом + нового файла (`old_60`/`new_60`, account="60") — иначе файл не заменяется вовсе (`_replaceable` не находит + совпадений, `file_ids` пуст, ранний `return []`), и `_outcome_fact` на `old_62` упал бы с `NoResultFound`. + `old_62` (account="62", CONFIRMED) — выпавший документ, на котором проверяется `SUPERSEDED_AFTER_CONFIRM`.""" maker = committed_sessionmaker async with maker() as session, session.begin(): confirmer = (await session.execute(select(AppUser).order_by(AppUser.email).limit(1))).scalar_one() @@ -1598,6 +1611,7 @@ async def test_supersede_previous_writes_superseded_after_confirm_for_confirmed_ old_file, old_job = await make_stored_file( session, entity=entity, status=FileStatus.PROCESSED, job_status=RecognitionStatus.done ) + await make_document(session, file=old_file, job=old_job, account="60") # триггер замены (совпадает по ключу) old_62 = await make_document(session, file=old_file, job=old_job, account="62", status=DocumentStatus.CONFIRMED) old_62.confirmed_by = confirmer.id new_file, new_job = await make_stored_file(