snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
81
zerver/tests/test_timestamp.py
Normal file
81
zerver/tests/test_timestamp.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from django.utils.translation import override as override_language
|
||||
|
||||
from zerver.lib.test_classes import ZulipTestCase
|
||||
from zerver.lib.timestamp import (
|
||||
TimeZoneMissingError,
|
||||
TimeZoneNotUTCError,
|
||||
ceiling_to_hour,
|
||||
convert_to_UTC,
|
||||
datetime_to_global_time,
|
||||
datetime_to_timestamp,
|
||||
floor_to_day,
|
||||
floor_to_hour,
|
||||
format_datetime_to_string,
|
||||
timestamp_to_datetime,
|
||||
)
|
||||
|
||||
|
||||
class TestTimestamp(ZulipTestCase):
|
||||
def test_datetime_and_timestamp_conversions(self) -> None:
|
||||
timestamp = 1483228800
|
||||
for dt in [
|
||||
datetime.fromisoformat("2017-01-01 00:00:00.123+00:00"),
|
||||
]:
|
||||
self.assertEqual(timestamp_to_datetime(timestamp), dt - timedelta(microseconds=123000))
|
||||
self.assertEqual(datetime_to_timestamp(dt), timestamp)
|
||||
|
||||
for dt in [
|
||||
datetime.fromisoformat("2017-01-01 00:00:00.123+01:00"),
|
||||
datetime.fromisoformat("2017-01-01 00:00:00.123"),
|
||||
]:
|
||||
with self.assertRaises(TimeZoneNotUTCError):
|
||||
datetime_to_timestamp(dt)
|
||||
|
||||
def test_convert_to_UTC(self) -> None:
|
||||
utc_datetime = datetime.fromisoformat("2017-01-01 00:00:00.123+00:00")
|
||||
for dt in [
|
||||
datetime.fromisoformat("2017-01-01 00:00:00.123+00:00"),
|
||||
datetime.fromisoformat("2017-01-01 00:00:00.123"),
|
||||
datetime.fromisoformat("2017-01-01T05:00:00.123+05:00"),
|
||||
]:
|
||||
self.assertEqual(convert_to_UTC(dt), utc_datetime)
|
||||
|
||||
def test_enforce_UTC(self) -> None:
|
||||
non_utc_datetime = datetime.fromisoformat("2017-01-01 00:00:00.123")
|
||||
for function in [floor_to_hour, floor_to_day, ceiling_to_hour, ceiling_to_hour]:
|
||||
with self.assertRaises(TimeZoneNotUTCError):
|
||||
function(non_utc_datetime)
|
||||
|
||||
def test_format_datetime_to_string(self) -> None:
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone.utc)
|
||||
self.assertEqual(format_datetime_to_string(dt, True), "Sat, Feb 3, 2001, 04:05 GMT")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone(timedelta(hours=7, minutes=8)))
|
||||
self.assertEqual(format_datetime_to_string(dt, True), "Sat, Feb 3, 2001, 04:05 GMT+7:08")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone(-timedelta(hours=7, minutes=8)))
|
||||
self.assertEqual(format_datetime_to_string(dt, True), "Sat, Feb 3, 2001, 04:05 GMT-7:08")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=ZoneInfo("America/Los_Angeles"))
|
||||
self.assertEqual(format_datetime_to_string(dt, True), "Sat, Feb 3, 2001, 04:05 PST")
|
||||
self.assertRegex(
|
||||
format_datetime_to_string(dt, False), r"^Sat, Feb 3, 2001, 4:05[ \u202f]AM PST$"
|
||||
)
|
||||
with override_language("ja-JP"):
|
||||
self.assertEqual(format_datetime_to_string(dt, True), "2001年2月3日(土) 4:05 GMT-8")
|
||||
self.assertEqual(
|
||||
format_datetime_to_string(dt, False), "2001年2月3日(土) 午前4:05 GMT-8"
|
||||
)
|
||||
|
||||
def test_datetime_to_global_time(self) -> None:
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone.utc)
|
||||
self.assertEqual(datetime_to_global_time(dt), "<time:2001-02-03T04:05:06+00:00>")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone(timedelta(hours=7, minutes=8)))
|
||||
self.assertEqual(datetime_to_global_time(dt), "<time:2001-02-03T04:05:06+07:08>")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=timezone(-timedelta(hours=7, minutes=8)))
|
||||
self.assertEqual(datetime_to_global_time(dt), "<time:2001-02-03T04:05:06-07:08>")
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6, tzinfo=ZoneInfo("America/Los_Angeles"))
|
||||
self.assertEqual(datetime_to_global_time(dt), "<time:2001-02-03T04:05:06-08:00>")
|
||||
with self.assertRaises(TimeZoneMissingError):
|
||||
dt = datetime(2001, 2, 3, 4, 5, 6) # noqa: DTZ001
|
||||
datetime_to_global_time(dt)
|
||||
Reference in New Issue
Block a user