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