Skip to content

Commit eaeb1b4

Browse files
committed
PYTHON-4691 Improve test to cover overflow on min too
1 parent 9f2dbe9 commit eaeb1b4

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

test/test_bson.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import uuid
3030
from collections import OrderedDict, abc
3131
from io import BytesIO
32+
from typing import Optional
3233

3334
sys.path[0:0] = [""]
3435

@@ -1301,19 +1302,34 @@ def test_tz_clamping_utc(self):
13011302
)
13021303

13031304
def test_tz_clamping_non_utc(self):
1304-
# Aware clamping non-utc.
1305-
tz = FixedOffset(60, "Custom")
1305+
class DivergentTimezone(FixedOffset):
1306+
"""A timezone that reverses the offset for dates before 1970."""
1307+
1308+
def utcoffset(self, dt: Optional[datetime]) -> datetime.timedelta:
1309+
if dt is None:
1310+
raise TypeError("DivergentTimezone.utcoffset requires a datetime")
1311+
offset = super().utcoffset(dt)
1312+
if dt.year < 1970:
1313+
return -offset
1314+
return offset
1315+
1316+
tz = DivergentTimezone(60, "Custom")
13061317
opts = CodecOptions(
13071318
datetime_conversion=DatetimeConversion.DATETIME_CLAMP, tz_aware=True, tzinfo=tz
13081319
)
13091320
# Min/max values in this timezone which can be represented in both BSON and datetime UTC.
1310-
min_tz = datetime.datetime.min.replace(tzinfo=utc).astimezone(tz)
1321+
min_tz = (
1322+
datetime.datetime.min.replace(tzinfo=utc) + datetime.timedelta(minutes=60)
1323+
).astimezone(tz)
13111324
max_tz = (
1312-
(datetime.datetime.max - datetime.timedelta(minutes=60))
1313-
.replace(tzinfo=utc)
1314-
.astimezone(tz)
1315-
.replace(microsecond=999000)
1316-
)
1325+
datetime.datetime.max.replace(tzinfo=utc, microsecond=999000)
1326+
- datetime.timedelta(minutes=60)
1327+
).astimezone(tz)
1328+
# Sanity check:
1329+
self.assertEqual(min_tz, datetime.datetime.min.replace(tzinfo=tz))
1330+
self.assertEqual(max_tz, datetime.datetime.max.replace(tzinfo=tz, microsecond=999000))
1331+
self.assertEqual(tz.utcoffset(datetime.datetime.min), datetime.timedelta(minutes=-60))
1332+
self.assertEqual(tz.utcoffset(datetime.datetime.max), datetime.timedelta(minutes=60))
13171333
for in_range in [
13181334
min_tz,
13191335
min_tz + datetime.timedelta(milliseconds=1),

0 commit comments

Comments
 (0)