"""Tests for deepscan queries, report building, and scheduler timing.""" from datetime import date, datetime from zoneinfo import ZoneInfo from gimme_job.proactive.plan import ProactivePlan from gimme_job.proactive.scheduler import next_run_at # ── deepscan ───────────────────────────────────────────────────────────────── def test_deepscan_queries_generated(): plan = ProactivePlan.load() queries = plan.deepscan.generate_queries() assert len(queries) > 0 assert len(queries) <= plan.deepscan.budget.max_queries assert any("site:myworkdayjobs.com" in q for q in queries) assert any("children's hospital" in q for q in queries) def test_deepscan_budget_cap(): plan = ProactivePlan.load() assert len(plan.deepscan.all_queries()) >= len(plan.deepscan.generate_queries()) # ── report ─────────────────────────────────────────────────────────────────── def test_report_empty_day_never_silent(): from gimme_job.proactive.report import build_report text = build_report(date(2026, 1, 1)) assert "Orthodontist Job Report" in text assert "오늘 신규/재오픈 공고 없음." in text assert "주(State) 커버리지" in text assert "No verified orthodontic match found today" in text # ── scheduler ──────────────────────────────────────────────────────────────── def test_next_run_daily_before_time(): now = datetime(2026, 9, 11, 5, 0, tzinfo=ZoneInfo("America/Phoenix")) dt, mode = next_run_at(now, "06:00", 6, "08:00") assert mode == "daily" assert dt.hour == 6 assert dt.day == now.day def test_next_run_daily_after_time_rolls_to_tomorrow(): now = datetime(2026, 9, 11, 7, 0, tzinfo=ZoneInfo("America/Phoenix")) dt, mode = next_run_at(now, "06:00", 6, "08:00") assert mode == "daily" assert dt.day == now.day + 1 def test_next_run_weekly_when_daily_passed_on_sunday(): # 2026-09-13 is Sunday (weekday 6). Daily 06:00 passed → weekly 08:00 wins. now = datetime(2026, 9, 13, 7, 0, tzinfo=ZoneInfo("America/Phoenix")) dt, mode = next_run_at(now, "06:00", 6, "08:00") assert mode == "weekly" assert dt.day == 13 assert dt.hour == 8 def test_next_run_daily_after_weekly_passed(): now = datetime(2026, 9, 13, 10, 0, tzinfo=ZoneInfo("America/Phoenix")) # Sunday 10am dt, mode = next_run_at(now, "06:00", 6, "08:00") assert mode == "daily" assert dt.day == 14 # Monday morning def test_next_run_daily_wins_when_before_weekly_same_day(): # Saturday 7am: daily Sunday 06:00 comes before weekly Sunday 08:00 now = datetime(2026, 9, 12, 7, 0, tzinfo=ZoneInfo("America/Phoenix")) dt, mode = next_run_at(now, "06:00", 6, "08:00") assert mode == "daily" assert dt.day == 13 assert dt.hour == 6