"""File deliverer: archive writes, receipts, errors.log alerting.""" from __future__ import annotations import json import pytest from _fakes import make_payload from sebrief.config import Settings from sebrief.deliver import build_deliverers from sebrief.deliver.base import DeliveryError from sebrief.deliver.file import FileDeliverer from sebrief.models import DigestResult def make_result() -> DigestResult: return DigestResult(payload=make_payload(), digest=None, markdown="# 다이제스트\n", model_used="m") def test_deliver_writes_md_and_json_keyed_by_week(tmp_path): deliverer = FileDeliverer(tmp_path / "reports") receipt = deliverer.deliver(make_result()) md = tmp_path / "reports" / "2026-W36.md" js = tmp_path / "reports" / "2026-W36.json" assert receipt == str(md) assert md.read_text(encoding="utf-8") == "# 다이제스트\n" data = json.loads(js.read_text(encoding="utf-8")) assert data["payload"]["week"] == "2026-W36" assert data["markdown"].startswith("# 다이제스트") def test_deliver_raises_delivery_error_on_os_error(tmp_path): blocker = tmp_path / "reports" blocker.write_text("file, not a dir") deliverer = FileDeliverer(blocker) with pytest.raises(DeliveryError): deliverer.deliver(make_result()) def test_notify_error_appends_flattened_line(tmp_path): deliverer = FileDeliverer(tmp_path / "reports") deliverer.notify_error("제목", "줄1\n줄2\n") deliverer.notify_error("두번째", "detail") lines = (tmp_path / "reports" / "errors.log").read_text(encoding="utf-8").splitlines() assert len(lines) == 2 ts, subject, detail = lines[0].split("\t") assert subject == "제목" and detail == "줄1 | 줄2" and ts assert lines[1].split("\t")[1] == "두번째" def test_notify_error_never_raises(tmp_path): blocker = tmp_path / "reports" blocker.write_text("file, not a dir") FileDeliverer(blocker).notify_error("s", "d") # must not raise def test_build_deliverers_is_file_only(tmp_path): settings = Settings(_env_file=None, SEBRIEF_REPORTS_DIR=str(tmp_path / "reports")) deliverers = build_deliverers(settings) assert [d.name for d in deliverers] == ["file"]