"""렌더 보고서 — ★ 발행 기록(DB)과 실제 페이지(정적 파일)의 간극을 드러낸다. 이 모듈이 절대 하면 안 되는 것: 1. 페이지가 없는데 "정상" 이라고 답하는 것 (사장님은 404 를 눌러 보고서야 안다) 2. 낡은 렌더를 현재 버전인 것처럼 통과시키는 것 3. 보고서가 깨졌다고 사이트 조회 자체를 실패시키는 것 (부수 산출물이다) """ import json import pytest from services import render_report @pytest.fixture def payload_dir(tmp_path, monkeypatch): """프리렌더가 보고서를 쓰는 자리를 임시 디렉토리로 돌린다.""" monkeypatch.setattr(render_report, "payload_dir", lambda: tmp_path) (tmp_path / render_report.STATUS_DIR).mkdir() return tmp_path def _write(payload_dir, slug, **overrides): report = { "schemaVersion": 1, "slug": slug, "siteId": "s-1", "placeId": "p-1", "siteVersion": 2, "ok": True, "renderedAt": "2026-08-28T00:00:00.000Z", "routes": 7, "bundle": "index-abc.js", "uniqueContentCount": 14, "jsonld": [{"@type": "LodgingBusiness", "name": "조이모텔", "telephone": "031-722-1942"}], "error": None, } report.update(overrides) path = payload_dir / render_report.STATUS_DIR / f"{slug}.json" path.write_text(json.dumps(report, ensure_ascii=False), encoding="utf-8") return report # ── 렌더 상태 ──────────────────────────────────────────────────────────────── def test_보고서가_없으면_아직_안_구운_것이다(payload_dir): # ★ "없음" 을 "정상" 으로 답하면 발행 직후 404 를 정상이라고 말하게 된다. assert render_report.render_status("joy", 1)["state"] == "PENDING" def test_현재_버전이_구워져_있으면_OK(payload_dir): _write(payload_dir, "joy", siteVersion=2) assert render_report.render_status("joy", 2)["state"] == "OK" def test_구운_버전이_낡았으면_STALE(payload_dir): # 발행은 됐는데(v3) 프리렌더는 아직 v2 만 구운 상태 — 방문자는 낡은 페이지를 본다. _write(payload_dir, "joy", siteVersion=2) assert render_report.render_status("joy", 3)["state"] == "STALE" def test_프리렌더가_실패했으면_FAILED_와_사유(payload_dir): _write(payload_dir, "joy", ok=False, error="schemaVersion=99") status = render_report.render_status("joy", 2) assert status["state"] == "FAILED" assert status["error"] == "schemaVersion=99" def test_모르는_스키마_버전은_정상이라고_답하지_않는다(payload_dir): # 반쯤 해석해서 "OK" 라고 답하는 게 최악이다 — 못 읽으면 안 구운 것으로 본다. _write(payload_dir, "joy", schemaVersion=99) assert render_report.render_status("joy", 2)["state"] == "PENDING" def test_깨진_보고서가_조회를_실패시키지_않는다(payload_dir): (payload_dir / render_report.STATUS_DIR / "joy.json").write_text("{깨진 JSON", encoding="utf-8") assert render_report.render_status("joy", 2)["state"] == "PENDING"