# retoor import pytest from devplacepy.services.devii.tasks.guards import task_columns from devplacepy.services.devii.tasks.schedule import ( DEFAULT_MAX_RUNS, MAX_LIFETIME_DAYS, MAX_MAX_RUNS, MIN_INTERVAL_SECONDS, Schedule, from_iso, now_utc, ) def test_interval_below_the_floor_is_rejected(): with pytest.raises(ValueError): Schedule(kind="interval", every_seconds=MIN_INTERVAL_SECONDS - 1) with pytest.raises(ValueError): Schedule(kind="interval", every_seconds=180) def test_interval_at_the_floor_is_accepted(): schedule = Schedule(kind="interval", every_seconds=MIN_INTERVAL_SECONDS) assert schedule.every_seconds == MIN_INTERVAL_SECONDS def test_cron_firing_faster_than_the_floor_is_rejected(): for expression in ("* * * * *", "*/5 * * * *", "*/14 * * * *"): with pytest.raises(ValueError): Schedule(kind="cron", cron=expression) def test_cron_with_an_uneven_step_is_rejected_for_its_boundary_hop(): with pytest.raises(ValueError): Schedule(kind="cron", cron="*/18 * * * *") def test_cron_at_or_above_the_floor_is_accepted(): for expression in ("*/15 * * * *", "0 * * * *", "0 22 * * *"): assert Schedule(kind="cron", cron=expression).cron == expression def test_max_runs_ceiling_is_enforced(): with pytest.raises(ValueError): Schedule(kind="interval", every_seconds=900, max_runs=MAX_MAX_RUNS + 1) with pytest.raises(ValueError): Schedule(kind="interval", every_seconds=900, max_runs=0) def test_recurring_task_without_max_runs_gets_the_default(): reference = now_utc() columns = task_columns(Schedule(kind="interval", every_seconds=900), reference) assert columns["max_runs"] == DEFAULT_MAX_RUNS def test_one_shot_task_keeps_no_run_limit(): reference = now_utc() columns = task_columns(Schedule(kind="once", delay_seconds=60), reference) assert columns["max_runs"] is None def test_every_task_gets_an_expiry_within_the_ceiling(): reference = now_utc() columns = task_columns(Schedule(kind="interval", every_seconds=900), reference) expiry = from_iso(columns["expires_at"]) assert expiry > reference assert (expiry - reference).days <= MAX_LIFETIME_DAYS def test_a_caller_cannot_extend_the_expiry_past_the_ceiling(): reference = now_utc() far = reference.replace(year=reference.year + 5) columns = task_columns( Schedule(kind="interval", every_seconds=900, expires_at=far), reference ) expiry = from_iso(columns["expires_at"]) assert (expiry - reference).days <= MAX_LIFETIME_DAYS