Skip to content

Commit b5b1a42

Browse files
Backend: Ensure all datetimes are tz-aware (#8696)
1 parent 1274984 commit b5b1a42

4 files changed

Lines changed: 43 additions & 31 deletions

File tree

app/backend/src/couchers/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ def is_valid_email(field: str) -> bool:
6767

6868

6969
def Timestamp_from_datetime(dt: datetime) -> Timestamp:
70+
if dt.tzinfo is None:
71+
raise ValueError("Cannot convert a naive datetime to a timestamp.")
72+
7073
pb_ts = Timestamp()
7174
pb_ts.FromDatetime(dt)
7275
return pb_ts

app/backend/src/tests/test_admin.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from datetime import date, datetime, timedelta
2+
from datetime import UTC, date, datetime, timedelta
33

44
import grpc
55
import pytest
@@ -675,7 +675,8 @@ def test_ListUserIds(db):
675675
with real_admin_session(super_token) as api:
676676
res = api.ListUserIds(
677677
admin_pb2.ListUserIdsReq(
678-
start_time=Timestamp_from_datetime(datetime(2000, 1, 1)), end_time=Timestamp_from_datetime(now())
678+
start_time=Timestamp_from_datetime(datetime(2000, 1, 1, tzinfo=UTC)),
679+
end_time=Timestamp_from_datetime(now()),
679680
)
680681
)
681682
assert len(res.user_ids) == 2

app/backend/src/tests/test_models.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import date, datetime
1+
from datetime import UTC, date, datetime
22

33
import pytest
44
from sqlalchemy import select
@@ -24,22 +24,30 @@ def test_user_age(db):
2424

2525

2626
def test_user_display_joined():
27-
assert make_user(joined=datetime(2020, 7, 10, 16, 34, 1, 1)).display_joined == datetime(2020, 7, 10, 16, 0, 0, 0)
28-
assert make_user(joined=datetime(2025, 7, 10, 16, 59, 1, 1)).display_joined == datetime(2025, 7, 10, 16, 0, 0, 0)
29-
assert make_user(joined=datetime(2020, 7, 10, 16, 0, 1, 1)).display_joined == datetime(2020, 7, 10, 16, 0, 0, 0)
30-
assert make_user(joined=datetime(2020, 7, 10, 0, 0, 0, 0)).display_joined == datetime(2020, 7, 10, 0, 0, 0, 0)
27+
assert make_user(joined=datetime(2020, 7, 10, 16, 34, 1, 1, tzinfo=UTC)).display_joined == datetime(
28+
2020, 7, 10, 16, 0, 0, 0, tzinfo=UTC
29+
)
30+
assert make_user(joined=datetime(2025, 7, 10, 16, 59, 1, 1, tzinfo=UTC)).display_joined == datetime(
31+
2025, 7, 10, 16, 0, 0, 0, tzinfo=UTC
32+
)
33+
assert make_user(joined=datetime(2020, 7, 10, 16, 0, 1, 1, tzinfo=UTC)).display_joined == datetime(
34+
2020, 7, 10, 16, 0, 0, 0, tzinfo=UTC
35+
)
36+
assert make_user(joined=datetime(2020, 7, 10, 0, 0, 0, 0, tzinfo=UTC)).display_joined == datetime(
37+
2020, 7, 10, 0, 0, 0, 0, tzinfo=UTC
38+
)
3139

3240

3341
def test_user_display_last_active():
34-
assert make_user(last_active=datetime(2020, 7, 10, 16, 34, 1, 1)).display_last_active == datetime(
35-
2020, 7, 10, 16, 0, 0, 0
42+
assert make_user(last_active=datetime(2020, 7, 10, 16, 34, 1, 1, tzinfo=UTC)).display_last_active == datetime(
43+
2020, 7, 10, 16, 0, 0, 0, tzinfo=UTC
3644
)
37-
assert make_user(last_active=datetime(2025, 7, 10, 17, 59, 1, 1)).display_last_active == datetime(
38-
2025, 7, 10, 17, 0, 0, 0
45+
assert make_user(last_active=datetime(2025, 7, 10, 17, 59, 1, 1, tzinfo=UTC)).display_last_active == datetime(
46+
2025, 7, 10, 17, 0, 0, 0, tzinfo=UTC
3947
)
40-
assert make_user(last_active=datetime(2020, 7, 10, 16, 0, 1, 1)).display_last_active == datetime(
41-
2020, 7, 10, 16, 0, 0, 0
48+
assert make_user(last_active=datetime(2020, 7, 10, 16, 0, 1, 1, tzinfo=UTC)).display_last_active == datetime(
49+
2020, 7, 10, 16, 0, 0, 0, tzinfo=UTC
4250
)
43-
assert make_user(last_active=datetime(2020, 7, 10, 0, 0, 0, 0)).display_last_active == datetime(
44-
2020, 7, 10, 0, 0, 0, 0
51+
assert make_user(last_active=datetime(2020, 7, 10, 0, 0, 0, 0, tzinfo=UTC)).display_last_active == datetime(
52+
2020, 7, 10, 0, 0, 0, 0, tzinfo=UTC
4553
)

app/backend/src/tests/test_public.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from datetime import UTC, datetime
2+
from datetime import UTC, date, datetime
33
from math import sqrt
44
from unittest.mock import patch
55

@@ -241,30 +241,30 @@ def test_GetVolunteers_mixed_current_and_past(db):
241241
make_volunteer(
242242
user_id=current1.id,
243243
role="Current Role 1",
244-
started_volunteering=datetime(2023, 1, 1).date(),
244+
started_volunteering=date(2023, 1, 1),
245245
)
246246
)
247247
session.add(
248248
make_volunteer(
249249
user_id=current2.id,
250250
role="Current Role 2",
251-
started_volunteering=datetime(2024, 1, 1).date(),
251+
started_volunteering=date(2024, 1, 1),
252252
)
253253
)
254254
session.add(
255255
make_volunteer(
256256
user_id=past1.id,
257257
role="Past Role 1",
258-
started_volunteering=datetime(2020, 1, 1).date(),
259-
stopped_volunteering=datetime(2022, 6, 1).date(),
258+
started_volunteering=date(2020, 1, 1),
259+
stopped_volunteering=date(2022, 6, 1),
260260
)
261261
)
262262
session.add(
263263
make_volunteer(
264264
user_id=past2.id,
265265
role="Past Role 2",
266-
started_volunteering=datetime(2021, 1, 1).date(),
267-
stopped_volunteering=datetime(2023, 12, 31).date(),
266+
started_volunteering=date(2021, 1, 1),
267+
stopped_volunteering=date(2023, 12, 31),
268268
)
269269
)
270270

@@ -295,7 +295,7 @@ def test_GetVolunteers_custom_sort_key(db):
295295
make_volunteer(
296296
user_id=user2.id,
297297
role="Role 2",
298-
started_volunteering=datetime(2023, 3, 1).date(),
298+
started_volunteering=date(2023, 3, 1),
299299
sort_key=1.0,
300300
)
301301
)
@@ -304,7 +304,7 @@ def test_GetVolunteers_custom_sort_key(db):
304304
make_volunteer(
305305
user_id=user3.id,
306306
role="Role 3",
307-
started_volunteering=datetime(2023, 1, 1).date(),
307+
started_volunteering=date(2023, 1, 1),
308308
sort_key=2.0,
309309
)
310310
)
@@ -313,7 +313,7 @@ def test_GetVolunteers_custom_sort_key(db):
313313
make_volunteer(
314314
user_id=user1.id,
315315
role="Role 1",
316-
started_volunteering=datetime(2023, 2, 1).date(),
316+
started_volunteering=date(2023, 2, 1),
317317
)
318318
)
319319

@@ -340,14 +340,14 @@ def test_GetVolunteers_excludes_hidden(db):
340340
make_volunteer(
341341
user_id=user1.id,
342342
role="Visible Role",
343-
started_volunteering=datetime(2023, 1, 1).date(),
343+
started_volunteering=date(2023, 1, 1),
344344
)
345345
)
346346
session.add(
347347
make_volunteer(
348348
user_id=user2.id,
349349
role="Hidden Role",
350-
started_volunteering=datetime(2023, 1, 1).date(),
350+
started_volunteering=date(2023, 1, 1),
351351
show_on_team_page=False,
352352
)
353353
)
@@ -374,15 +374,15 @@ def test_GetVolunteers_link_types(db):
374374
make_volunteer(
375375
user_id=user_default.id,
376376
role="Default Link",
377-
started_volunteering=datetime(2023, 1, 1).date(),
377+
started_volunteering=date(2023, 1, 1),
378378
)
379379
)
380380
# Volunteer with custom link
381381
session.add(
382382
make_volunteer(
383383
user_id=user_custom.id,
384384
role="Custom Link",
385-
started_volunteering=datetime(2023, 1, 1).date(),
385+
started_volunteering=date(2023, 1, 1),
386386
link_type="email",
387387
link_text="contact@example.com",
388388
link_url="mailto:contact@example.com",
@@ -421,14 +421,14 @@ def test_GetVolunteers_board_member_flag(db):
421421
make_volunteer(
422422
user_id=board_member.id,
423423
role="Board Member Role",
424-
started_volunteering=datetime(2023, 1, 1).date(),
424+
started_volunteering=date(2023, 1, 1),
425425
)
426426
)
427427
session.add(
428428
make_volunteer(
429429
user_id=regular_volunteer.id,
430430
role="Regular Role",
431-
started_volunteering=datetime(2023, 1, 1).date(),
431+
started_volunteering=date(2023, 1, 1),
432432
)
433433
)
434434

0 commit comments

Comments
 (0)