#!/usr/bin/env python3 import csv import tempfile from pathlib import Path from export_events import convert, load_json, spreadsheet_safe from summarize import summarize from check_fetch import check_fetch ROOT = Path(__file__).resolve().parent def main(): config = load_json(ROOT / "mapping.json") inputs = [ROOT / "sample-page-1.json", ROOT / "sample-page-2.json"] with tempfile.TemporaryDirectory() as folder: output = Path(folder) / "events.csv" assert convert(inputs, config, output) == {"rows": 4, "duplicates_skipped": 1} assert output.read_bytes() == (ROOT / "expected.csv").read_bytes() summary = Path(folder) / "summary.csv" summarize(output, summary) assert summary.read_bytes() == (ROOT / "expected-summary.csv").read_bytes() with output.open(encoding="utf-8-sig", newline="") as stream: rows = list(csv.DictReader(stream)) assert sum(row["Тип"] == "no_helmet" for row in rows) == 3 assert spreadsheet_safe(" =SUM(1,1)").startswith("'") bad = Path(folder) / "bad.json" bad.write_text('{"events":[{"demo_event_id":"evt-001"}]}', encoding="utf-8") before = output.read_bytes() try: convert(inputs + [bad], config, output) except ValueError: pass else: raise AssertionError("разные события с одинаковым ключом приняты") assert output.read_bytes() == before bad.write_text('{"events":[{"demo_event_id":"evt-999"}]}', encoding="utf-8") try: convert([bad], config, output) except ValueError: pass else: raise AssertionError("пропущенное поле принято") print("PASS: CSV, BI counts, duplicate, conflicting version, missing field, formula escaping") check_fetch() if __name__ == "__main__": main()