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.

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