arm-tabular-parser/api/tests/fixtures/test_readers_real.py
Andrey Epifancev 71f596cdb7 feat: формы через arm_statements, контракт результата и конверта v2.0, статус и OSV_* у ОСВ (#54)
- копия схем и примеров контракта v2.0 (запрос остаётся v1.0), модели result/common/message/request;
  ResultWarning/FileWarning, статус и предупреждения у документов, строки forms v2.0, service.statements_version
- statements/pipeline.py: кандидаты адаптера -> normalize_candidate -> to_contract / warning_to_contract
- BookParser: статус книги через envelope_status, SHEET_OTHER / FILE_TYPE_MISMATCH / XLS_NO_CODEPAGE как предупреждения
  файла, OSV_* и OSV_XLSB_NO_OUTLINE в документах ОСВ, тексты иерархии по спеке
- воркер, app и CLI получают statements_version из require_statements_version()
- старые модели документа формы вынесены в statements/legacy_models.py до удаления старого конвейера (задача 9)
- OpenSpec: MODIFIED «Парсер — заменяемый интерфейс» в дельте tabular-recognition-service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:52:52 +04:00

50 lines
2.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Читатели на реальных ОСВ из ../fixtures: все 66 файлов читаются быстро, outline и merged на месте."""
import time
from pathlib import Path
from typing import cast
import pytest
from src.contract import FileType
from src.parser.readers import read_book, read_book_detected
READ_SECONDS_LIMIT = 5.0
NAMED_XLS = "osv/schastl/2024-Q3/Оборотносальдовая ведомость по счету 62 за 3 квартал 2024 г..xls"
# Строка 15 (1-based) — контрагент «МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО» под 62 → 62.01 → «БП Аренда»
NAMED_XLS_ROW = 15
NAMED_XLS_OUTLINE = 3
@pytest.mark.fixtures
def test_real_file_is_read_quickly_with_outline_and_merged(osv_file: Path) -> None:
data = osv_file.read_bytes()
started = time.perf_counter()
sheets, warnings = read_book(data, cast(FileType, osv_file.suffix.lstrip(".").upper()))
assert time.perf_counter() - started < READ_SECONDS_LIMIT
assert warnings == []
assert sheets
assert any(sheet.row_outline for sheet in sheets)
assert all(level >= 1 for sheet in sheets for level in sheet.row_outline.values())
assert any(sheet.merged for sheet in sheets)
assert any(sheet.cells for sheet in sheets)
@pytest.mark.fixtures
def test_named_xls_outline_level(fixtures_dir: Path) -> None:
sheets, _ = read_book((fixtures_dir / NAMED_XLS).read_bytes(), "XLS")
sheet = sheets[0]
assert sheet.cell(NAMED_XLS_ROW, 1).text == "МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО"
assert sheet.outline(NAMED_XLS_ROW) == NAMED_XLS_OUTLINE
@pytest.mark.fixtures
def test_biff8_content_with_xlsx_file_type_is_read_as_xls(fixtures_dir: Path) -> None:
read = read_book_detected((fixtures_dir / NAMED_XLS).read_bytes(), "XLSX")
assert read.mismatch == "file_type=XLSX, но содержимое BIFF8: прочитано как XLS"
assert read.sheets[0].outline(NAMED_XLS_ROW) == NAMED_XLS_OUTLINE