Skip to content

Commit 9282c8d

Browse files
test: add coverage for naive datetime ISO8601 assume-UTC fallback
The _format_datetime_iso8601 function silently assumes UTC for naive (timezone-unaware) datetimes by appending +00:00. This path had no test coverage. Add tests documenting the behavior: UTC assumption, microsecond preservation, and the naive-in/aware-out round-trip asymmetry. Closes #166. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent dcb7a4f commit 9282c8d

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

tests/test_types.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,3 +843,40 @@ def test_encode_value_false_as_explicit_integer(self) -> None:
843843
encoded, vtype = encode_value(False, ValueType.INTEGER)
844844
assert vtype == ValueType.INTEGER
845845
assert decode_int64(encoded) == 0
846+
847+
848+
class TestNaiveDatetimeISO8601:
849+
"""166: naive datetime 'assume UTC' fallback path is untested."""
850+
851+
def test_naive_datetime_assumes_utc(self) -> None:
852+
"""Naive datetime is encoded as UTC (+00:00)."""
853+
import datetime
854+
855+
naive = datetime.datetime(2024, 6, 15, 12, 30, 45) # noqa: DTZ001
856+
encoded, vtype = encode_value(naive, ValueType.ISO8601)
857+
assert vtype == ValueType.ISO8601
858+
decoded, _ = decode_value(encoded, ValueType.ISO8601)
859+
assert decoded.utcoffset() == datetime.timedelta(0)
860+
assert decoded.year == 2024
861+
assert decoded.month == 6
862+
assert decoded.hour == 12
863+
864+
def test_naive_datetime_with_microseconds(self) -> None:
865+
"""Naive datetime with fractional seconds encodes correctly."""
866+
import datetime
867+
868+
naive = datetime.datetime(2024, 1, 1, 0, 0, 0, 123456) # noqa: DTZ001
869+
encoded, _ = encode_value(naive, ValueType.ISO8601)
870+
decoded, _ = decode_value(encoded, ValueType.ISO8601)
871+
assert decoded.microsecond == 123456
872+
873+
def test_naive_datetime_roundtrip_becomes_aware(self) -> None:
874+
"""Naive datetime round-trips as timezone-aware UTC."""
875+
import datetime
876+
877+
naive = datetime.datetime(2024, 6, 15, 12, 30, 45) # noqa: DTZ001
878+
assert naive.tzinfo is None
879+
encoded, _ = encode_value(naive, ValueType.ISO8601)
880+
decoded, _ = decode_value(encoded, ValueType.ISO8601)
881+
assert decoded.tzinfo is not None
882+
assert decoded.replace(tzinfo=None) == naive

0 commit comments

Comments
 (0)