Files
sebrief/tests/test_deliver.py
2026-09-02 14:57:29 +09:00

63 lines
2.2 KiB
Python

"""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"]