Files
familienarchiv/tools/import-normalizer/tests/test_writers.py
2026-05-25 14:43:45 +02:00

61 lines
2.6 KiB
Python

import csv
import openpyxl
import overrides
import writers
import documents
def test_load_overrides_missing_files(tmp_path):
d, n = overrides.load_overrides(tmp_path / "dates.csv", tmp_path / "names.csv")
assert d == {} and n == {}
def test_load_overrides_parsed(tmp_path):
dp = tmp_path / "dates.csv"
dp.write_text("raw,iso,precision\n13.5.65,1965-05-13,DAY\n", encoding="utf-8")
np = tmp_path / "names.csv"
np.write_text("raw,person_id\nEugenie Müller,de-gruyter-eugenie\n", encoding="utf-8")
d, n = overrides.load_overrides(dp, np)
assert d["13.5.65"] == ("1965-05-13", "DAY")
assert n["Eugenie Müller"] == "de-gruyter-eugenie"
def test_write_documents_xlsx_joins_lists(tmp_path):
doc = documents.CanonicalDocument(
index="W-0001", receiver_person_ids=["a", "b"], receiver_names=["A", "B"],
tags=["Brautbriefe"], date_precision="DAY", needs_review=["unparsed_date"])
out = tmp_path / "docs.xlsx"
writers.write_documents_xlsx([doc], out)
wb = openpyxl.load_workbook(out)
ws = wb.active
header = [c.value for c in ws[1]]
assert "receiver_person_ids" in header and "needs_review" in header
row = {h: c.value for h, c in zip(header, ws[2])}
assert row["receiver_person_ids"] == "a|b"
assert row["needs_review"] == "unparsed_date"
def test_write_documents_xlsx_pins_timestamp(tmp_path):
# determinism (NFR-IDEM-01): workbook created/modified are pinned, not the current time
doc = documents.CanonicalDocument(index="W-0001")
out = tmp_path / "d.xlsx"
writers.write_documents_xlsx([doc], out)
wb = openpyxl.load_workbook(out)
assert (wb.properties.created.year, wb.properties.created.month, wb.properties.created.day) == (2020, 1, 1)
def test_write_review_csv(tmp_path):
out = tmp_path / "r.csv"
writers.write_review_csv(out, ["raw", "count"], [["?", 3], ["x", 1]])
rows = list(csv.reader(out.open(encoding="utf-8")))
assert rows[0] == ["raw", "count"]
assert rows[1] == ["?", "3"]
def test_write_review_csv_defangs_formula_injection(tmp_path):
out = tmp_path / "r.csv"
writers.write_review_csv(out, ["raw", "count"], [["=cmd|'/C calc'!A0", 1], ["-2+3", 2]])
rows = list(csv.reader(out.open(encoding="utf-8")))
assert rows[1][0].startswith("'=") # leading '=' neutralised
assert rows[2][0].startswith("'-")
def test_write_summary_sections(tmp_path):
out = tmp_path / "s.txt"
writers.write_summary(out, {"# INPUTS": "", "rows": 10, "# DATES": "", "unknown_date_rate": "3.2%"})
text = out.read_text(encoding="utf-8")
assert "INPUTS:" in text and "DATES:" in text and " rows: 10" in text