Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
57 lines
3.0 KiB
Python
57 lines
3.0 KiB
Python
from datetime import date
|
||
|
||
from arm_statements.header import continuation_type, is_continuation, parse_header, type_hint
|
||
from arm_statements.loader import Rules
|
||
from arm_statements.model import DocumentType, HeaderCells
|
||
from arm_statements.tests.builders import hdr
|
||
|
||
|
||
def test_inn_digits_only_without_lookalikes(rules: Rules) -> None:
|
||
head = parse_header(hdr(inn="|7700000000|"), rules)
|
||
assert head.inn.value == "7700000000"
|
||
dirty = parse_header(hdr(inn=("3|1 21 2|", 80.0)), rules)
|
||
assert dirty.inn.value is None
|
||
assert (dirty.inn.text, dirty.inn.confidence) == ("3|1 21 2|", 80.0)
|
||
|
||
|
||
def test_units_by_text_then_okei(rules: Rules) -> None:
|
||
assert parse_header(hdr(units="в тыс. рублей"), rules).units.value == "тыс. руб."
|
||
by_okei = parse_header(hdr(okei="384"), rules)
|
||
assert (by_okei.units.value, by_okei.okei.value, by_okei.units.text) == ("тыс. руб.", "384", None)
|
||
assert parse_header(hdr(units="руб."), rules).units.value == "руб."
|
||
|
||
|
||
def test_report_date_and_codes(rules: Rules) -> None:
|
||
head = parse_header(hdr(report_date="30.09.2О25", okud="Форма по ОКУД 0710001", okopf="12267"), rules)
|
||
assert head.report_date.value == date(2025, 9, 30)
|
||
assert (head.okud.value, head.okopf.value) == ("0710001", "12267")
|
||
|
||
|
||
def test_type_hint_okud_wins(rules: Rules) -> None:
|
||
assert type_hint("0710002", "Бухгалтерский баланс", rules) is DocumentType.INCOME
|
||
assert type_hint("Форма по ОКУД 0710001", None, rules) is DocumentType.BALANCE
|
||
assert type_hint("0710005", None, rules) is DocumentType.DISCLOSURE
|
||
assert type_hint(None, "Пояснения к бухгалтерскому балансу", rules) is DocumentType.DISCLOSURE
|
||
assert type_hint(None, "Отчет о прибылях и убытках", rules) is DocumentType.INCOME
|
||
assert type_hint(None, "Бухгалтерская отчетность", rules) is None
|
||
|
||
|
||
def test_continuation_marker(rules: Rules) -> None:
|
||
assert continuation_type("Форма 0710002 с.2", rules) is DocumentType.INCOME
|
||
assert continuation_type("Бухгалтерский баланс", rules) is None
|
||
assert is_continuation("Форма 0710000 с. 3", rules) and continuation_type("Форма 0710000 с. 3", rules) is None
|
||
assert not is_continuation("Бухгалтерский баланс", rules) and not is_continuation(None, rules)
|
||
|
||
|
||
def test_type_hint_uses_label_normalization(rules: Rules) -> None:
|
||
assert type_hint(None, "ОТЧЁТ О ФИНАНСОВЫХ\nРЕЗУЛЬТАТАХ", rules) is DocumentType.INCOME
|
||
|
||
|
||
def test_absent_cells_and_empty_values(rules: Rules) -> None:
|
||
head = parse_header(HeaderCells(), rules)
|
||
assert (head.inn.text, head.inn.confidence, head.inn.value) == (None, None, None)
|
||
assert head.report_date.value is None and head.needs_review_fields == ()
|
||
blank = parse_header(hdr(okpo=" ", organization_name=" ООО «Пример» "), rules)
|
||
assert blank.okpo.value is None
|
||
assert blank.organization_name.value == "ООО «Пример»"
|