From 667722cc1b1ad0cd1a1136035d76d3c0ed06a45e Mon Sep 17 00:00:00 2001 From: Eric Cao Date: Mon, 8 Jun 2026 16:45:51 +0800 Subject: [PATCH] fix(harness): use UTC as fallback timezone in EnvironmentResolver When `strptime` with `%z` fails to parse the timezone offset, the fallback previously produced a naive datetime, violating the documented contract ("Timezone-aware datetime on the computer"). Now falls back to UTC so `today_date.tzinfo` is always set. Fixes #26 --- libs/uniharness/tests/unit_tests/harness/test_environment.py | 4 ++-- libs/uniharness/uniharness/harness/environment.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/uniharness/tests/unit_tests/harness/test_environment.py b/libs/uniharness/tests/unit_tests/harness/test_environment.py index 984a83c6..1e3960ef 100644 --- a/libs/uniharness/tests/unit_tests/harness/test_environment.py +++ b/libs/uniharness/tests/unit_tests/harness/test_environment.py @@ -76,12 +76,12 @@ async def test_datetime_with_timezone(self) -> None: assert env.today_date == datetime(2026, 3, 13, 10, 30, 0, tzinfo=UTC) async def test_datetime_without_timezone_fallback(self) -> None: - """Falls back to naive datetime when timezone offset is missing.""" + """Falls back to UTC when timezone offset cannot be parsed.""" computer = _mock_computer(_make_stdout(date="2026-03-13T10:30:00")) env = await EnvironmentResolver(computer).resolve() assert env.today_date.year == 2026 - assert env.today_date.tzinfo is None + assert env.today_date.tzinfo is not None async def test_empty_datetime_raises(self) -> None: computer = _mock_computer(_make_stdout(date="")) diff --git a/libs/uniharness/uniharness/harness/environment.py b/libs/uniharness/uniharness/harness/environment.py index ab553745..abd41afe 100644 --- a/libs/uniharness/uniharness/harness/environment.py +++ b/libs/uniharness/uniharness/harness/environment.py @@ -6,7 +6,7 @@ from __future__ import annotations -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING from uniharness.types import EnvironmentContext @@ -78,7 +78,7 @@ async def resolve(self) -> EnvironmentContext: try: now = datetime.strptime(raw_dt, "%Y-%m-%dT%H:%M:%S%z") except ValueError: - now = datetime.strptime(raw_dt[:19], "%Y-%m-%dT%H:%M:%S") # noqa: DTZ007 + now = datetime.strptime(raw_dt[:19], "%Y-%m-%dT%H:%M:%S").replace(tzinfo=UTC) return EnvironmentContext( working_dir=values[0],