test_dates.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from zoneinfo import ZoneInfo
  4. from supply_infra.config import InfraSettings
  5. from supply_infra.pipeline.dates import (
  6. build_date_snapshot,
  7. deadline_for_trigger,
  8. next_daily_deadline_china,
  9. next_schedule_china,
  10. resolve_biz_dt,
  11. )
  12. def _settings() -> InfraSettings:
  13. return InfraSettings(
  14. _env_file=None,
  15. SCHEDULER_TIMEZONE="Asia/Shanghai",
  16. SCHEDULER_CRON_HOUR=15,
  17. SCHEDULER_CRON_MINUTE=0,
  18. )
  19. def test_date_snapshot_is_frozen_from_biz_dt() -> None:
  20. assert build_date_snapshot("20260727") == {
  21. "biz_dt": "20260727",
  22. "global_tree_partition": "20260726",
  23. "demand_pool_partition": "20260727",
  24. "video_decode_partition": "20260726",
  25. }
  26. def test_resolve_biz_dt_uses_scheduler_timezone() -> None:
  27. now = datetime(2026, 7, 27, 1, 2, tzinfo=ZoneInfo("Asia/Shanghai"))
  28. assert resolve_biz_dt(None, settings=_settings(), now=now) == "20260727"
  29. def test_deadline_is_next_scheduler_start() -> None:
  30. now = datetime(2026, 7, 27, 15, 1, tzinfo=ZoneInfo("Asia/Shanghai"))
  31. deadline = next_schedule_china(settings=_settings(), now=now)
  32. assert deadline.isoformat() == "2026-07-28T15:00:00"
  33. def test_scheduled_daily_deadline_is_always_next_local_day() -> None:
  34. before_cron = datetime(2026, 7, 27, 14, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
  35. after_cron = datetime(2026, 7, 27, 16, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
  36. assert next_daily_deadline_china(
  37. settings=_settings(),
  38. now=before_cron,
  39. ).isoformat() == "2026-07-28T15:00:00"
  40. assert next_daily_deadline_china(
  41. settings=_settings(),
  42. now=after_cron,
  43. ).isoformat() == "2026-07-28T15:00:00"
  44. def test_only_scheduled_triggers_receive_a_deadline() -> None:
  45. now = datetime(2026, 7, 27, 15, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
  46. assert deadline_for_trigger(
  47. "cron",
  48. settings=_settings(),
  49. now=now,
  50. ).isoformat() == "2026-07-28T15:00:00"
  51. assert deadline_for_trigger(
  52. "reconcile",
  53. settings=_settings(),
  54. now=now,
  55. ).isoformat() == "2026-07-28T15:00:00"
  56. assert deadline_for_trigger("api", settings=_settings(), now=now) is None
  57. assert deadline_for_trigger("cli", settings=_settings(), now=now) is None