You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gimme-job/tests/proactive/test_deepscan_report_schedu...

78 lines
3.1 KiB
Python

"""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