import datetime from app.types import CampaignSendTimezone from tests.unit.helpers import build_model class TestCampaignSendTimezoneSafeUntil: def test_returns_none_when_not_in_safe_hours(self) -> None: timezone_entry = build_model( CampaignSendTimezone, isInSafeHours=False, isAdjusted=True ) assert timezone_entry.safe_until is None def test_computes_utc_close_time_respecting_dst(self) -> None: timezone_entry = build_model( CampaignSendTimezone, ianaTzId="America/New_York", sendAtLocal="2026-07-08T10:00:00", quietHoursMax="20:00:00", isInSafeHours=True, ) # America/New_York is UTC-4 (EDT) in July, not the -5 standard offset. assert timezone_entry.safe_until == datetime.datetime( 2026, 7, 9, 0, 0, tzinfo=datetime.UTC ) def test_returns_none_for_unknown_timezone(self) -> None: timezone_entry = build_model( CampaignSendTimezone, ianaTzId="Not/AZone", isInSafeHours=True ) assert timezone_entry.safe_until is None def test_returns_none_for_out_of_range_quiet_hours_max(self) -> None: # "24:00:00" is a common end-of-day convention but not a valid `time`. timezone_entry = build_model( CampaignSendTimezone, quietHoursMax="24:00:00", isInSafeHours=True ) assert timezone_entry.safe_until is None