Skip to content

Commit 5b77b7c

Browse files
authored
Merge pull request #767 from NHSDigital/refactor-reports-tests
Refactor reconciliation query test
2 parents adb4703 + c64768b commit 5b77b7c

File tree

1 file changed

+130
-84
lines changed

1 file changed

+130
-84
lines changed
Lines changed: 130 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
from collections import namedtuple
23
from datetime import datetime, timedelta
34

@@ -13,48 +14,6 @@
1314
MessageFactory,
1415
)
1516

16-
17-
def formatted(dt: datetime):
18-
return dt.strftime("%Y-%m-%d %H:%M")
19-
20-
21-
def days_time(days: int):
22-
return datetime.now(tz=ZONE_INFO) + timedelta(days=days)
23-
24-
25-
def create_appointment_set(
26-
nhs_number: str,
27-
date: datetime,
28-
clinic: Clinic,
29-
appointment_status: str,
30-
episode_type: str,
31-
message_status: str | None = None,
32-
channel_statuses: dict[str, str] | None = None,
33-
):
34-
now = datetime.now(tz=ZONE_INFO)
35-
appt = AppointmentFactory(
36-
clinic=clinic,
37-
status=appointment_status,
38-
episode_type=episode_type,
39-
nhs_number=nhs_number,
40-
starts_at=date,
41-
)
42-
if appointment_status == "C":
43-
appt.cancelled_at = now
44-
appt.save()
45-
46-
if message_status:
47-
message = MessageFactory(appointment=appt, status=message_status, sent_at=now)
48-
for channel, status in channel_statuses.items():
49-
ChannelStatusFactory(
50-
message=message,
51-
channel=channel,
52-
status=status,
53-
status_updated_at=now,
54-
)
55-
return appt
56-
57-
5817
ResultRow = namedtuple(
5918
"ResultRow",
6019
[
@@ -95,118 +54,173 @@ def setup(self):
9554
}
9655

9756
test_data = [
98-
["9991112211", days_time(4), clinic1, "B", "R"],
99-
["9991112214", days_time(6), clinic2, "C", "G"],
100-
["9991112221", days_time(5), clinic2, "B", "R", "failed", failed],
101-
["9991112222", days_time(6), clinic1, "B", "S", "delivered", nhsapp_read],
102-
["9991112223", days_time(5), clinic2, "B", "S", "delivered", sms_delivered],
103-
["9991112229", days_time(5), clinic1, "B", "R", "delivered", letter_sent],
104-
["9991112252", days_time(6), clinic2, "C", "S", "delivered", nhsapp_read],
57+
["9991112211", clinic1, "B", "R"],
58+
["9991112214", clinic2, "C", "G"],
59+
["9991112221", clinic2, "B", "R", "failed", failed],
60+
["9991112222", clinic1, "B", "S", "delivered", nhsapp_read],
61+
["9991112223", clinic2, "B", "S", "delivered", sms_delivered],
62+
["9991112229", clinic1, "B", "R", "delivered", letter_sent],
63+
["9991112252", clinic2, "C", "S", "delivered", nhsapp_read],
10564
]
10665

10766
for d in test_data:
108-
create_appointment_set(*d)
67+
self.create_appointment_set(*d)
10968

110-
@time_machine.travel(datetime.now(tz=ZONE_INFO), tick=False)
69+
@time_machine.travel(datetime.now(tz=ZONE_INFO))
11170
def test_appointments_with_various_delivery_states(self):
112-
now = datetime.now(tz=ZONE_INFO)
71+
def formatted(dt: datetime):
72+
return dt.strftime("%Y-%m-%d %H:%M")
73+
11374
results = Helper.fetchall("reconciliation", ["1 week", "BSO1"])
11475

115-
r = ResultRow(*results[0])
76+
date_pattern = r"^\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}$"
77+
sorted_results = sorted(results, key=lambda res: res[0])
78+
79+
r = ResultRow(*sorted_results[0])
11680
assert r.nhs_number == "9991112211"
11781
assert r.clinic == "BSU 1 (BU001)"
11882
assert r.episode_type == "Routine recall"
11983
assert r.status == "Booked"
12084
assert r.message_status == "Pending"
121-
assert r.created_at == formatted(now)
122-
assert r.appointment_starts_at == formatted(days_time(4))
85+
assert re.search(date_pattern, r.created_at), (
86+
f"{r.created_at} does not match {date_pattern}"
87+
)
88+
assert re.search(date_pattern, r.appointment_starts_at), (
89+
f"{r.appointment_starts_at} does not match {date_pattern}"
90+
)
12391
assert r.cancelled_at is None
12492
assert r.message_sent_at is None
12593
assert r.nhs_app_read_at is None
12694
assert r.sms_delivered_at is None
12795
assert r.letter_sent_at is None
12896

129-
r = ResultRow(*results[1])
97+
r = ResultRow(*sorted_results[1])
13098
assert r.nhs_number == "9991112214"
13199
assert r.clinic == "BSU 2 (BU002)"
132100
assert r.episode_type == "GP Referral"
133101
assert r.status == "Cancelled"
134102
assert r.message_status == "Pending"
135-
assert r.created_at == formatted(now)
136-
assert r.appointment_starts_at == formatted(days_time(6))
137-
assert r.cancelled_at == formatted(now)
103+
assert re.search(date_pattern, r.created_at), (
104+
f"{r.created_at} does not match {date_pattern}"
105+
)
106+
assert re.search(date_pattern, r.appointment_starts_at), (
107+
f"{r.appointment_starts_at} does not match {date_pattern}"
108+
)
109+
assert re.search(date_pattern, r.cancelled_at), (
110+
f"{r.cancelled_at} does not match {date_pattern}"
111+
)
138112
assert r.message_sent_at is None
139113
assert r.nhs_app_read_at is None
140114
assert r.sms_delivered_at is None
141115
assert r.letter_sent_at is None
142116

143-
r = ResultRow(*results[2])
117+
r = ResultRow(*sorted_results[2])
144118
assert r.nhs_number == "9991112221"
145119
assert r.clinic == "BSU 2 (BU002)"
146120
assert r.episode_type == "Routine recall"
147121
assert r.status == "Booked"
148122
assert r.message_status == "Failed"
149-
assert r.created_at == formatted(now)
150-
assert r.appointment_starts_at == formatted(days_time(5))
123+
assert re.search(date_pattern, r.created_at), (
124+
f"{r.created_at} does not match {date_pattern}"
125+
)
126+
assert re.search(date_pattern, r.appointment_starts_at), (
127+
f"{r.appointment_starts_at} does not match {date_pattern}"
128+
)
151129
assert r.cancelled_at is None
152-
assert r.message_sent_at == formatted(now)
130+
assert re.search(date_pattern, r.message_sent_at), (
131+
f"{r.message_sent_at} does not match {date_pattern}"
132+
)
153133
assert r.nhs_app_read_at is None
154134
assert r.sms_delivered_at is None
155135
assert r.letter_sent_at is None
156136

157-
r = ResultRow(*results[3])
137+
r = ResultRow(*sorted_results[3])
158138
assert r.nhs_number == "9991112222"
159139
assert r.clinic == "BSU 1 (BU001)"
160140
assert r.episode_type == "Self referral"
161141
assert r.status == "Booked"
162142
assert r.message_status == "Notified"
163-
assert r.created_at == formatted(now)
164-
assert r.appointment_starts_at == formatted(days_time(6))
143+
assert re.search(date_pattern, r.created_at), (
144+
f"{r.created_at} does not match {date_pattern}"
145+
)
146+
assert re.search(date_pattern, r.appointment_starts_at), (
147+
f"{r.appointment_starts_at} does not match {date_pattern}"
148+
)
165149
assert r.cancelled_at is None
166-
assert r.message_sent_at == formatted(now)
167-
assert r.nhs_app_read_at == formatted(now)
150+
assert re.search(date_pattern, r.message_sent_at), (
151+
f"{r.message_sent_at} does not match {date_pattern}"
152+
)
153+
assert re.search(date_pattern, r.nhs_app_read_at), (
154+
f"{r.nhs_app_read_at} does not match {date_pattern}"
155+
)
168156
assert r.sms_delivered_at is None
169157
assert r.letter_sent_at is None
170158

171-
r = ResultRow(*results[4])
159+
r = ResultRow(*sorted_results[4])
172160
assert r.nhs_number == "9991112223"
173161
assert r.clinic == "BSU 2 (BU002)"
174162
assert r.episode_type == "Self referral"
175163
assert r.status == "Booked"
176164
assert r.message_status == "Notified"
177-
assert r.created_at == formatted(now)
178-
assert r.appointment_starts_at == formatted(days_time(5))
165+
assert re.search(date_pattern, r.created_at), (
166+
f"{r.created_at} does not match {date_pattern}"
167+
)
168+
assert re.search(date_pattern, r.appointment_starts_at), (
169+
f"{r.appointment_starts_at} does not match {date_pattern}"
170+
)
179171
assert r.cancelled_at is None
180-
assert r.message_sent_at == formatted(now)
172+
assert re.search(date_pattern, r.message_sent_at), (
173+
f"{r.message_sent_at} does not match {date_pattern}"
174+
)
181175
assert r.nhs_app_read_at is None
182-
assert r.sms_delivered_at == formatted(now)
176+
assert re.search(date_pattern, r.sms_delivered_at), (
177+
f"{r.sms_delivered_at} does not match {date_pattern}"
178+
)
183179
assert r.letter_sent_at is None
184180

185-
r = ResultRow(*results[5])
181+
r = ResultRow(*sorted_results[5])
186182
assert r.nhs_number == "9991112229"
187183
assert r.clinic == "BSU 1 (BU001)"
188184
assert r.episode_type == "Routine recall"
189185
assert r.status == "Booked"
190186
assert r.message_status == "Notified"
191-
assert r.created_at == formatted(now)
192-
assert r.appointment_starts_at == formatted(days_time(5))
187+
assert re.search(date_pattern, r.created_at), (
188+
f"{r.created_at} does not match {date_pattern}"
189+
)
190+
assert re.search(date_pattern, r.appointment_starts_at), (
191+
f"{r.appointment_starts_at} does not match {date_pattern}"
192+
)
193193
assert r.cancelled_at is None
194-
assert r.message_sent_at == formatted(now)
194+
assert re.search(date_pattern, r.message_sent_at), (
195+
f"{r.message_sent_at} does not match {date_pattern}"
196+
)
195197
assert r.nhs_app_read_at is None
196198
assert r.sms_delivered_at is None
197-
assert r.letter_sent_at == formatted(now)
199+
assert re.search(date_pattern, r.letter_sent_at), (
200+
f"{r.letter_sent_at} does not match {date_pattern}"
201+
)
198202

199-
r = ResultRow(*results[6])
203+
r = ResultRow(*sorted_results[6])
200204
assert r.nhs_number == "9991112252"
201205
assert r.clinic == "BSU 2 (BU002)"
202206
assert r.episode_type == "Self referral"
203207
assert r.status == "Cancelled"
204208
assert r.message_status == "Notified"
205-
assert r.created_at == formatted(now)
206-
assert r.appointment_starts_at == formatted(days_time(6))
207-
assert r.cancelled_at == formatted(now)
208-
assert r.message_sent_at == formatted(now)
209-
assert r.nhs_app_read_at == formatted(now)
209+
assert re.search(date_pattern, r.created_at), (
210+
f"{r.created_at} does not match {date_pattern}"
211+
)
212+
assert re.search(date_pattern, r.appointment_starts_at), (
213+
f"{r.appointment_starts_at} does not match {date_pattern}"
214+
)
215+
assert re.search(date_pattern, r.cancelled_at), (
216+
f"{r.cancelled_at} does not match {date_pattern}"
217+
)
218+
assert re.search(date_pattern, r.message_sent_at), (
219+
f"{r.message_sent_at} does not match {date_pattern}"
220+
)
221+
assert re.search(date_pattern, r.nhs_app_read_at), (
222+
f"{r.nhs_app_read_at} does not match {date_pattern}"
223+
)
210224
assert r.sms_delivered_at is None
211225
assert r.letter_sent_at is None
212226

@@ -219,3 +233,35 @@ def test_appointments_filtered_for_specified_bso(self):
219233
results = Helper.fetchall("reconciliation", ["1 week", "MDB"])
220234
assert len(results) == 2
221235
assert ResultRow(*results[0]).clinic == "Breast Care Unit (BU001)"
236+
237+
def create_appointment_set(
238+
self,
239+
nhs_number: str,
240+
clinic: Clinic,
241+
appointment_status: str,
242+
episode_type: str,
243+
message_status: str | None = None,
244+
channel_statuses: dict[str, str] | None = None,
245+
):
246+
now = datetime.now(tz=ZONE_INFO)
247+
appt = AppointmentFactory(
248+
clinic=clinic,
249+
status=appointment_status,
250+
episode_type=episode_type,
251+
nhs_number=nhs_number,
252+
starts_at=now + timedelta(days=21),
253+
cancelled_at=(now if appointment_status == "C" else None),
254+
)
255+
256+
if message_status:
257+
message = MessageFactory(
258+
appointment=appt, status=message_status, sent_at=now
259+
)
260+
for channel, status in channel_statuses.items():
261+
ChannelStatusFactory(
262+
message=message,
263+
channel=channel,
264+
status=status,
265+
status_updated_at=now,
266+
)
267+
return appt

0 commit comments

Comments
 (0)