1+ import re
12from collections import namedtuple
23from datetime import datetime , timedelta
34
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-
5817ResultRow = 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