"""스케줄러에 무엇이 등록돼 있나. ★★ 이 파일이 있는 이유: `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