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(