From e6696fa4402de5151874769eea3f1435f0a2a244 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 6 Oct 2026 16:35:55 +0400 Subject: [PATCH] =?UTF-8?q?fix(statements):=20cleanup=20guard=20tests=20?= =?UTF-8?q?=E2=80=94=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=D0=BF=D0=BE=D0=BB=D0=BE=D0=B6=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20(Fix=20round=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обнаружено: test_inn_from_auditor_above_organization_inn_line не тестирует guard, т.к. org INN всегда раньше auditor block в реальных файлах. Без guard первый найденный INN всё равно организации (появляется раньше). Guard не differentiates этот сценарий. Удалены: - test_inn_skips_auditor_block — ложноположительный, docstring утверждал Review Focus, но тест проходит из-за порядка (org INN раньше auditor), не из-за guard. Функциональность покрыта test_one_c_header. - test_inn_from_auditor_above_organization_inn_line — guard не differentiates; добавлен в попытке тестировать сценарий, невозможный по дизайну. Оставлен test_inn_from_auditor_block_only_is_none — единственный тест, где guard реально нужен: без org INN, только auditor блок → guard исключает его, возвращает None. Guard работает корректно: тестирует edge case отсутствия org INN. Итог: 6 тестов, все честны относительно требований к guard. Refs #14 Co-Authored-By: Claude Haiku 4.5 Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b --- .../unit/parser/statements/test_header.py | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/api/tests/unit/parser/statements/test_header.py b/api/tests/unit/parser/statements/test_header.py index 8fcdc4f..ba92d37 100644 --- a/api/tests/unit/parser/statements/test_header.py +++ b/api/tests/unit/parser/statements/test_header.py @@ -157,14 +157,6 @@ def test_missing_units_and_organization_warn(rules: Rules) -> None: assert any("организация" in warning for warning in warnings) -def test_inn_skips_auditor_block(rules: Rules) -> None: - """Review Focus: ИНН аудитора (строка 16) не должен попасть в header.inn.""" - sheet = sheet_from_rows(ONE_C) - header, _ = parse_header(sheet, rules, 1, 16, _block(sheet, rules)) - assert header.inn == "3249004697", f"Expected organization INN 3249004697, got {header.inn}" - assert header.inn != "7716021332", "Auditor INN 7716021332 should not be included" - - def test_inn_from_auditor_block_only_is_none(rules: Rules) -> None: """Guard test (a): without org INN, only auditor block ИНН — should be None.""" sheet = sheet_from_rows( @@ -192,38 +184,3 @@ def test_inn_from_auditor_block_only_is_none(rules: Rules) -> None: header, _ = parse_header(sheet, rules, 1, 9, _block(sheet, rules)) assert header.inn is None, f"Should not pick up auditor INN 9999999999, got {header.inn}" - - -def test_inn_from_auditor_above_organization_inn_line(rules: Rules) -> None: - """Guard test (b): org INN before auditor block; guard excludes auditor INN. - - Organization section (rows 1-4) has INN 1234567890. - Auditor block starts at row 5 and has INN 7716021332. - Guard searches up to row 4, finds org INN. - """ - sheet = sheet_from_rows( - [ - [*at({3: "Бухгалтерский баланс"})], - [*at({3: "на 31 декабря 2024 г."})], - [*at({7: 'ООО "ЗАВОД"'})], - [*at({2: "Идентификационный номер налогоплательщика", 33: "ИНН", 34: "1234567890"})], - [*at({2: "Наименование аудиторской организации"})], - [*at({2: 'АО "ЮНИКОН"'})], - [ - *at( - { - 2: "Идентификационный номер налогоплательщика аудиторской организации", - 33: "ИНН", - 34: "7716021332", - } - ) - ], - [*at({2: "Единица измерения", 7: "в тыс. рублей", 33: "по ОКЕИ", 34: "384"})], - ] - ) - - header, _ = parse_header(sheet, rules, 1, 8, _block(sheet, rules)) - - assert header.inn == "1234567890", ( - f"Should pick organization INN 1234567890, not auditor INN 7716021332, got {header.inn}" - )