-
Notifications
You must be signed in to change notification settings - Fork 29
/
test_time_utils.py
114 lines (106 loc) · 3.27 KB
/
test_time_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from datetime import datetime, timedelta
import pytz
import pytest
from flexmeasures.utils.time_utils import (
server_now,
naturalized_datetime_str,
get_most_recent_clocktime_window,
)
@pytest.mark.parametrize(
"dt_tz,now,server_tz,delta_in_h,exp_result",
# there can be two results depending of today's date, due to humanize.
# Monekypatching was too hard.
[
(None, datetime.utcnow(), "UTC", 3, "3 hours ago"),
(
None,
datetime(2021, 5, 17, 3),
"Europe/Amsterdam",
48,
("May 15", "May 15 2021"),
),
("Asia/Seoul", "server_now", "Europe/Amsterdam", 1, "an hour ago"),
(
"UTC",
datetime(2021, 5, 17, 3),
"Asia/Seoul",
24 * 7,
("May 10", "May 10 2021"),
),
("UTC", datetime(2021, 5, 17, 3), "Asia/Seoul", None, "never"),
],
)
def test_naturalized_datetime_str(
app,
monkeypatch,
dt_tz,
now,
server_tz,
delta_in_h,
exp_result,
):
monkeypatch.setitem(app.config, "FLEXMEASURES_TIMEZONE", server_tz)
if now == "server_now":
now = server_now() # done this way as it needs (patched) app context
if now.tzinfo is None:
now = now.replace(tzinfo=pytz.utc) # assuming UTC
if delta_in_h is not None:
h_ago = now - timedelta(hours=delta_in_h)
if dt_tz is not None:
h_ago = h_ago.astimezone(pytz.timezone(dt_tz))
else:
h_ago = None
if isinstance(exp_result, tuple):
assert naturalized_datetime_str(h_ago, now=now) in exp_result
else:
assert naturalized_datetime_str(h_ago, now=now) == exp_result
@pytest.mark.parametrize(
"window_size,now,exp_start,exp_end",
[
(
5,
datetime(2021, 4, 30, 15, 1),
datetime(2021, 4, 30, 14, 55),
datetime(2021, 4, 30, 15),
),
(
15,
datetime(2021, 4, 30, 3, 36),
datetime(2021, 4, 30, 3, 15),
datetime(2021, 4, 30, 3, 30),
),
(
10,
datetime(2021, 4, 30, 0, 5),
datetime(2021, 4, 29, 23, 50),
datetime(2021, 4, 30, 0, 0),
),
(
5,
datetime(2021, 5, 20, 10, 5, 34), # boundary condition
datetime(2021, 5, 20, 9, 55),
datetime(2021, 5, 20, 10, 0),
),
(
60,
datetime(2021, 1, 1, 0, 4), # new year
datetime(2020, 12, 31, 23, 00),
datetime(2021, 1, 1, 0, 0),
),
(
60,
datetime(2021, 3, 28, 3, 10), # DST transition
datetime(2021, 3, 28, 2),
datetime(2021, 3, 28, 3),
),
],
)
def test_recent_clocktime_window(window_size, now, exp_start, exp_end):
start, end = get_most_recent_clocktime_window(window_size, now=now)
assert start == exp_start
assert end == exp_end
def test_recent_clocktime_window_invalid_window():
with pytest.raises(AssertionError):
get_most_recent_clocktime_window(25, now=datetime(2021, 4, 30, 3, 36))
get_most_recent_clocktime_window(120, now=datetime(2021, 4, 30, 3, 36))
get_most_recent_clocktime_window(0, now=datetime(2021, 4, 30, 3, 36))