- test_osv_dkb.py: на каждом из 25 файлов пакета ДКБ — статусы листов по манифесту osv_dkb_expectations.yaml (данные, не if по имени файла), период по каталогу (2025-Q3, 2024-10_2025-09), структура строк, контракт, время разбора. - golden: osv-dkb/** до порога GOLDEN_MAX_BYTES = 1 МиБ (22 из 25 файлов; три файла Агрокомплекса 9–14 МБ — без снимков); golden_update, golden_helpers (подкаталог osv-dkb/), conftest (dkb_file, dkb_golden_file), хелперы. - dkb_helpers: expected_period, манифест; юнит-тесты без каталога fixtures. Stacked on #15. Closes #10 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
47 lines
2.4 KiB
Python
47 lines
2.4 KiB
Python
"""Golden-снимки разбора (design D-10): результат парсера для каждого файла `fixtures/osv/**`, синтетики и файлов
|
||
`fixtures/osv-dkb/**` до `GOLDEN_MAX_BYTES` равен снимку в `fixtures/golden/expected_osv_parse/` (зеркало дерева
|
||
`osv/`, пакет ДКБ — в подкаталоге `osv-dkb/`), без volatile-полей.
|
||
|
||
Снимок — регрессия, а не оракул (оракулы — ручная сверка «Итого» и property-тест). Обновление — `make golden-update`,
|
||
отдельным коммитом в репозиторий fixtures с просмотром diff.
|
||
"""
|
||
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
from golden_helpers import check_snapshot, golden_path
|
||
|
||
from src.parser import Parser, get_parser
|
||
|
||
pytestmark = pytest.mark.fixtures
|
||
|
||
|
||
@pytest.fixture(scope="module")
|
||
def parser() -> Parser:
|
||
return get_parser()
|
||
|
||
|
||
def test_osv_file_matches_golden_snapshot(fixtures_dir: Path, osv_file: Path, parser: Parser) -> None:
|
||
check_snapshot(fixtures_dir, osv_file, parser)
|
||
|
||
|
||
def test_dkb_file_matches_golden_snapshot(fixtures_dir: Path, dkb_golden_file: Path, parser: Parser) -> None:
|
||
"""Пакет ДКБ: снимки только у файлов не больше `GOLDEN_MAX_BYTES` (большие — property-тесты `test_osv_dkb.py`)."""
|
||
check_snapshot(fixtures_dir, dkb_golden_file, parser)
|
||
|
||
|
||
def test_synthetic_file_matches_golden_snapshot(fixtures_dir: Path, synthetic_file: Path, parser: Parser) -> None:
|
||
check_snapshot(fixtures_dir, synthetic_file, parser)
|
||
|
||
|
||
def test_every_snapshot_has_a_source_file(fixtures_dir: Path) -> None:
|
||
"""Лишний снимок (файл удалён или переименован) — ошибка: `make golden-update` его удаляет."""
|
||
from fixtures_helpers import osv_dkb_golden_files, osv_fixture_files, synthetic_files # noqa: PLC0415 - один тест
|
||
|
||
sources = [*osv_fixture_files(fixtures_dir), *osv_dkb_golden_files(fixtures_dir), *synthetic_files(fixtures_dir)]
|
||
expected = {golden_path(fixtures_dir, file) for file in sources}
|
||
directory = fixtures_dir / "golden" / "expected_osv_parse"
|
||
present = set(directory.rglob("*.json")) if directory.is_dir() else set()
|
||
|
||
assert sorted(path.relative_to(fixtures_dir).as_posix() for path in present - expected) == []
|