"""회기 읽기 모델의 시간 직렬화 계약 테스트.""" from __future__ import annotations import unittest from datetime import datetime, timezone from .session_projection import iso from .session_read_model import session_calendar_date from .services.session_metrics import iso_datetime class SessionReadModelIsoTest(unittest.TestCase): def test_none_remains_none(self) -> None: self.assertIsNone(iso(None)) def test_epoch_is_serialized_as_utc_with_offset(self) -> None: self.assertEqual(iso(0), "1970-01-01T00:00:00+00:00") def test_timestamp_round_trips_without_local_timezone_drift(self) -> None: timestamp = 1_800_000_120.0 rendered = iso(timestamp) self.assertIsNotNone(rendered) assert rendered is not None parsed = datetime.fromisoformat(rendered) self.assertEqual(parsed.tzinfo, timezone.utc) self.assertEqual(parsed.timestamp(), timestamp) def test_serialized_timestamp_has_explicit_utc_suffix(self) -> None: rendered = iso(1_800_000_120.0) self.assertIsNotNone(rendered) assert rendered is not None self.assertTrue(rendered.endswith("+00:00")) def test_dashboard_metrics_use_the_same_utc_contract(self) -> None: timestamp = 1_800_000_120.0 self.assertEqual(iso_datetime(timestamp), iso(timestamp)) def test_review_calendar_date_uses_korea_standard_time(self) -> None: utc_late_afternoon = datetime(2026, 8, 8, 15, 30, tzinfo=timezone.utc) self.assertEqual(session_calendar_date(utc_late_afternoon.timestamp()), "2026-08-09") if __name__ == "__main__": unittest.main()