(self)
| 623 | self.assertEqual(as_utc, after) |
| 624 | |
| 625 | def test_local_datetime(self): |
| 626 | # Timezone -60 minutes of UTC, with DST between April and July. |
| 627 | tz = DSTAwareTimezone(60, "sixty-minutes", 4, 7) |
| 628 | |
| 629 | # It's not DST. |
| 630 | local = datetime.datetime(year=2025, month=12, hour=2, day=1, tzinfo=tz) |
| 631 | options = CodecOptions(tz_aware=True, tzinfo=tz) |
| 632 | # Encode with this timezone, then decode to UTC. |
| 633 | encoded = encode({"date": local}, codec_options=options) |
| 634 | self.assertEqual(local.replace(hour=1, tzinfo=None), decode(encoded)["date"]) |
| 635 | |
| 636 | # It's DST. |
| 637 | local = datetime.datetime(year=2025, month=4, hour=1, day=1, tzinfo=tz) |
| 638 | encoded = encode({"date": local}, codec_options=options) |
| 639 | self.assertEqual( |
| 640 | local.replace(month=3, day=31, hour=23, tzinfo=None), decode(encoded)["date"] |
| 641 | ) |
| 642 | |
| 643 | # Encode UTC, then decode in a different timezone. |
| 644 | encoded = encode({"date": local.replace(tzinfo=utc)}) |
| 645 | decoded = decode(encoded, options)["date"] |
| 646 | self.assertEqual(local.replace(hour=3), decoded) |
| 647 | self.assertEqual(tz, decoded.tzinfo) |
| 648 | |
| 649 | # Test round-tripping. |
| 650 | self.assertEqual( |
| 651 | local, decode(encode({"date": local}, codec_options=options), options)["date"] |
| 652 | ) |
| 653 | |
| 654 | # Test around the Unix Epoch. |
| 655 | epochs = ( |
| 656 | EPOCH_AWARE, |
| 657 | EPOCH_AWARE.astimezone(FixedOffset(120, "one twenty")), |
| 658 | EPOCH_AWARE.astimezone(FixedOffset(-120, "minus one twenty")), |
| 659 | ) |
| 660 | utc_co = CodecOptions(tz_aware=True) |
| 661 | for epoch in epochs: |
| 662 | doc = {"epoch": epoch} |
| 663 | # We always retrieve datetimes in UTC unless told to do otherwise. |
| 664 | self.assertEqual(EPOCH_AWARE, decode(encode(doc), codec_options=utc_co)["epoch"]) |
| 665 | # Round-trip the epoch. |
| 666 | local_co = CodecOptions(tz_aware=True, tzinfo=epoch.tzinfo) |
| 667 | self.assertEqual(epoch, decode(encode(doc), codec_options=local_co)["epoch"]) |
| 668 | |
| 669 | def test_naive_decode(self): |
| 670 | aware = datetime.datetime(1993, 4, 4, 2, tzinfo=FixedOffset(555, "SomeZone")) |
nothing calls this directly
no test coverage detected