"""Publishing a summary: one set of files, one pointer, never a partial result.""" from __future__ import annotations import csv import json import pytest from evidence_helpers import multipoint_session from orisys_autocal.summary import build_summary from orisys_autocal.summary_export import ( POINTER_FORMAT, POINTER_NAME, SummaryExportError, load_summary, publish_summary, render_html, ) @pytest.fixture def session(tmp_path): root = multipoint_session( tmp_path / "rec", sites=("P1", "P2"), repeats=2, levels=(5.0, 10.0)) return root def _pointer(root): return json.loads((root / POINTER_NAME).read_text(encoding="utf-8")) def _read_csv(path): with path.open(encoding="utf-8-sig", newline="") as handle: return list(csv.DictReader(handle)) def test_publishing_writes_all_four_files_and_moves_the_pointer(session): summary = build_summary(session) published = publish_summary(session, summary) assert published.is_dir() assert published.name == f"summary_{summary['summary_id']}" for name in ("summary.json", "summary.html", "baseline_load_data.csv", "sensitivity_values.csv"): assert (published / name).is_file(), name pointer = _pointer(session) assert pointer["format_version"] == POINTER_FORMAT assert pointer["summary_id"] == summary["summary_id"] assert pointer["path"] == f"derived/{published.name}" assert set(pointer["files"]) == { "summary.json", "summary.html", "baseline_load_data.csv", "sensitivity_values.csv"} loaded, pointer_again = load_summary(session) assert loaded["summary_id"] == summary["summary_id"] assert pointer_again["summary_id"] == summary["summary_id"] # The export is a snapshot of the same object, not a second computation. stored = json.loads((published / "summary.json").read_text(encoding="utf-8")) assert stored["windows"] == summary["windows"] assert stored["sensitivity"] == summary["sensitivity"] def test_the_html_is_self_contained_and_escapes_operator_text(session): summary = build_summary(session) summary = dict(summary) summary["sensor_sn"] = "" document = render_html(summary) assert "