Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
"""Шапка документа из `data_ocr` (§11.1 п. 8) на реальных `aep_3.json` (мусор) и `aep_6.json` (чисто)."""
|
||
|
||
import json
|
||
from datetime import date
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
from src.normalizer.ocr.header import FileHeader, parse_file_header
|
||
|
||
API_DIR = Path(__file__).resolve().parents[3]
|
||
REAL_FIXTURES = API_DIR.parent.parent / "fixtures" / "ocr"
|
||
LOOKALIKES = {"О": "0", "о": "0", "З": "3", "l": "1", "I": "1", "|": "1", "б": "6", "S": "5", "Ч": "4"}
|
||
|
||
|
||
def _real(name: str) -> dict:
|
||
if not REAL_FIXTURES.is_dir():
|
||
pytest.skip("fixtures недоступен: положите репозиторий fixtures рядом с workspace")
|
||
return dict(json.loads((REAL_FIXTURES / name).read_text(encoding="utf-8"))["data_ocr"])
|
||
|
||
|
||
def _field(text: str, confidence: float) -> dict:
|
||
return {"form_name": text, "confidence": confidence}
|
||
|
||
|
||
def test_clean_header() -> None:
|
||
header = parse_file_header(
|
||
{
|
||
"organization": _field("ООО Ромашка", 97.5),
|
||
"inn": _field("7700000000", 100),
|
||
"units": _field("тыс. руб.", 100),
|
||
"date": _field("на 31 декабря 2024 г.", 100),
|
||
},
|
||
LOOKALIKES,
|
||
)
|
||
assert header == FileHeader(
|
||
"ООО Ромашка",
|
||
97.5,
|
||
"7700000000",
|
||
100.0,
|
||
"тыс. руб.",
|
||
"на 31 декабря 2024 г.",
|
||
date(2024, 12, 31),
|
||
True,
|
||
)
|
||
|
||
|
||
def test_noisy_inn_caps_confidence() -> None:
|
||
header = parse_file_header({"inn": _field("3|1 21 2| о! О' 0 0; 3: 51", 100)}, LOOKALIKES)
|
||
assert header.inn == "3121200351"
|
||
assert header.inn_confidence == 99.0
|
||
assert header.organization_name is None and header.organization_confidence is None
|
||
|
||
|
||
def test_missing_fields() -> None:
|
||
header = parse_file_header({}, LOOKALIKES)
|
||
assert header == FileHeader(None, None, None, None, None, None, None, False)
|
||
|
||
|
||
@pytest.mark.fixtures
|
||
def test_aep6_header() -> None:
|
||
header = parse_file_header(_real("aep_6.json"), LOOKALIKES)
|
||
assert header.inn is None # текст «+»
|
||
assert header.units == "тыс. руб."
|
||
assert header.report_date is None # в поле date — название организации
|
||
assert header.report_date_text is not None and header.report_date_recognized is False
|
||
assert header.organization_name is not None and "Дорстроймонтаж" in header.organization_name
|
||
|
||
|
||
@pytest.mark.fixtures
|
||
def test_aep3_header() -> None:
|
||
header = parse_file_header(_real("aep_3.json"), LOOKALIKES)
|
||
assert header.inn == "3121200351" and header.inn_confidence is not None and header.inn_confidence < 100
|
||
assert header.report_date == date(2024, 12, 31)
|
||
assert header.report_date_recognized is False # confidence 75
|