63 lines
2.2 KiB
Python
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"]
|