o2o-site-AEO/solution/backend/tests/test_scheduler_registration.py
hbyang 519ed4a79b [fix] solution/backend,deploy: 미니블로그 재고 자동 채우기를 스위치로 격리 — 기본 꺼짐
2026-10-01 대표 지시("이거는 안보내도 될것같아"). 켜면 발행된 사이트 **전체**가 대상이고
업장당 최대 30건이라 첫 회차에 AI 호출이 한꺼번에 일어난다 — 그 비용은 사람이 정할 일이지
기본값이 정할 일이 아니다. 글은 빌더의 [지금 생성하기] 로 사장님이 직접 만든다.

★ add_job 을 다시 지우지 않고 스위치로 뺀 이유: 바로 앞 커밋(4650125)이 고친 게
  "등록 자체가 없는데 주석만 새벽에 채운다고 말하는" 상태였다. 지우면 그 상태로 돌아가
  **끈 것과 빠뜨린 것이 구별되지 않는다** — 증상("메일이 안 온다")을 보고 발송 쪽을
  뒤지게 된다. 지금은 꺼져 있다는 사실이 코드에 남는다.

★ 발송(09:00)은 이 스위치와 무관하게 항상 돈다 — 손으로 만든 글도 나가야 한다.

- scheduler/__init__: BLOG_AUTO_DRAFTS_ENABLED=1 일 때만 blog-drafts 등록
- docker-compose · .env.example: 스위치 전달, 기본 0
- docs/MINI_BLOG 2절: 기본 꺼짐과 그 이유, 예전에 등록이 없었다는 실측

테스트 5건(2건 신설 — 기본 꺼짐 · 켜면 등록됨), 전부 통과

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-01 10:52:31 +09:00

59 lines
2.6 KiB
Python

"""스케줄러에 무엇이 등록돼 있나.
★★ 이 파일이 있는 이유: `sweep_blog_drafts` 가 **등록돼 있지 않았다**(실측 2026-09-30).
`scheduler/jobs.py` 에 함수는 있고 주석도 "새벽에 재고를 채운다" 라고 말하는데
`add_job` 한 줄이 없어 한 번도 돈 적이 없다. 증상은 "미니블로그 메일이 안 온다" 로만
보여서 발송 쪽을 보게 된다 — 실제로는 **보낼 글이 0건**이었다.
잡 하나가 빠져도 서버는 정상으로 뜨고 로그에도 에러가 없다. 그래서 세는 것이다.
"""
import pytest
import scheduler
@pytest.fixture
def start(monkeypatch):
"""실제로 돌리지 않는다 — 등록만 본다."""
def _start(**env):
monkeypatch.setenv("SCHEDULER_ENABLED", "1")
for k, v in env.items():
monkeypatch.setenv(k, v)
monkeypatch.setattr("apscheduler.schedulers.asyncio.AsyncIOScheduler.start", lambda self: None)
scheduler._scheduler = None
scheduler.start_scheduler()
return scheduler._scheduler
yield _start
scheduler._scheduler = None
def test_발송은_스위치_없이도_등록된다(start):
"""메일·카톡 발송은 항상 돈다 — 사장님이 직접 만든 글도 나가야 한다."""
assert "blog-mail" in {j.id for j in start().get_jobs()}
def test_자동_재고채우기는_기본으로_꺼져_있다(start):
"""★ 2026-10-01 대표 지시. 켜면 발행 사이트 전체에 업장당 30건씩 AI 호출이 일어난다 —
기본값이 정할 일이 아니다."""
assert "blog-drafts" not in {j.id for j in start().get_jobs()}
def test_스위치를_켜면_등록된다(start):
"""★ 빠뜨린 것과 끈 것은 다르다 — 켜지는지까지 봐야 '격리했다' 가 성립한다."""
assert "blog-drafts" in {j.id for j in start(BLOG_AUTO_DRAFTS_ENABLED="1").get_jobs()}
def test_재고_채우기가_발송보다_앞선다(start):
"""그날 아침에 나갈 글이 있으려면 생성이 먼저여야 한다."""
by_id = {j.id: j for j in start(BLOG_AUTO_DRAFTS_ENABLED="1").get_jobs()}
hour = lambda j: int(str(by_id[j].trigger.fields[by_id[j].trigger.FIELD_NAMES.index("hour")]))
assert hour("blog-drafts") < hour("blog-mail")
def test_스위치가_꺼지면_아무것도_등록하지_않는다(monkeypatch):
"""키 없는 환경에 돌지도 않을 잡을 만들어 두지 않는다."""
monkeypatch.setenv("SCHEDULER_ENABLED", "0")
scheduler._scheduler = None
scheduler.start_scheduler()
assert scheduler._scheduler is None