@@ -39,42 +39,52 @@ def compose_diagnosis_text_with_reason(
3939 return item_text
4040
4141
42+ def prepare_subject_for_test (
43+ page : Page , criteria : dict , role : str , select_episode_radio : bool = True
44+ ) -> str :
45+ """
46+ Queries subject by criteria, logs in with role, navigates to search, and opens profile.
47+
48+ Returns:
49+ str: The subject's NHS number
50+ """
51+ user = User ()
52+ subject = Subject ()
53+ builder = SubjectSelectionQueryBuilder ()
54+ query , bind_vars = builder .build_subject_selection_query (
55+ criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
56+ )
57+ df = OracleDB ().execute_query (query , bind_vars )
58+ if df .empty :
59+ raise ValueError ("No matching subject found with provided episode criteria." )
60+
61+ nhs_number = df .iloc [0 ]["subject_nhs_number" ]
62+ UserTools .user_login (page , role )
63+ BasePage (page ).go_to_screening_subject_search_page ()
64+ if select_episode_radio :
65+ page .get_by_role ("radio" , name = "Episodes" ).check ()
66+ search_subject_episode_by_nhs_number (page , nhs_number )
67+ return nhs_number
68+
69+
4270# Scenario 1
4371@pytest .mark .regression
4472@pytest .mark .vpn_required
4573@pytest .mark .fobt_diagnosis_date_entry
4674def test_screening_centre_manager_records_diagnosis_date_for_subject_with_referral_no_diag (
4775 page : Page ,
4876):
49- # Step 1: Obtain NHS number for a subject matching criteria
77+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
5078 criteria = {
5179 "latest episode type" : "FOBT" ,
5280 "latest episode status" : "Open" ,
5381 "latest episode has referral date" : "Past" ,
5482 "latest episode has diagnosis date" : "No" ,
5583 "latest episode diagnosis date reason" : "NULL" ,
5684 }
57- user = User ()
58- subject = Subject ()
59- builder = SubjectSelectionQueryBuilder ()
60- query , bind_vars = builder .build_subject_selection_query (
61- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
62- )
63- df = OracleDB ().execute_query (query , bind_vars )
64- if df .empty :
65- raise ValueError ("No matching subject found with provided episode criteria." )
85+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
6686
67- # Step 2: Login and search for subject
68- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
69- BasePage (page ).go_to_screening_subject_search_page ()
70-
71- # Step 3: Select episode radio button
72- page .get_by_role ("radio" , name = "Episodes" ).check ()
73-
74- # Step 4: Search subject and go to profile
75- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
76-
77- # Step 5: Interact with subject page
87+ # Step 2: Interact with subject page
7888 subject_page_s1 = RecordDiagnosisDatePage (page )
7989 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
8090 page .get_by_role ("button" , name = "Record Diagnosis Date" ).click ()
@@ -83,7 +93,7 @@ def test_screening_centre_manager_records_diagnosis_date_for_subject_with_referr
8393 page .get_by_role ("link" , name = "List Episodes" ).click ()
8494 page .get_by_role ("link" , name = "events" ).click ()
8595
86- # Step 6 : Assertions
96+ # Step 3 : Assertions
8797 subject_event_s1 = SubjectEpisodeEventsAndNotesPage (page )
8898 event_details = subject_event_s1 .get_latest_event_details ()
8999 assert "A50" not in event_details ["latest_event_status" ]
@@ -103,35 +113,17 @@ def test_screening_centre_manager_records_diagnosis_date_for_subject_with_referr
103113@pytest .mark .vpn_required
104114@pytest .mark .fobt_diagnosis_date_entry
105115def test_cannot_record_diagnosis_date_without_referral (page : Page ):
106- # Step 1: Obtain NHS number for a subject matching criteria
116+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
107117 criteria = {
108118 "latest episode type" : "FOBT" ,
109119 "latest episode status" : "Open" ,
110120 "latest episode has referral date" : "No" ,
111121 "latest episode has diagnosis date" : "No" ,
112122 "latest episode diagnosis date reason" : "NULL" ,
113123 }
114- user = User ()
115- subject = Subject ()
116- builder = SubjectSelectionQueryBuilder ()
117- query , bind_vars = builder .build_subject_selection_query (
118- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
119- )
120- df = OracleDB ().execute_query (query , bind_vars )
121- if df .empty :
122- raise ValueError ("No matching subject found with provided episode criteria." )
123-
124- # Step 2: Login and search for subject
125- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
126- BasePage (page ).go_to_screening_subject_search_page ()
124+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
127125
128- # Step 3: Select episode radio button
129- page .get_by_role ("radio" , name = "Episodes" ).check ()
130-
131- # Step 4: Search subject and go to profile
132- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
133-
134- # Step 5: Interact with subject page
126+ # Step 2: Interact with subject page
135127 advance_fobt_button_s2 = page .get_by_role (
136128 "button" , name = "Advance FOBT Screening Episode"
137129 )
@@ -140,7 +132,7 @@ def test_cannot_record_diagnosis_date_without_referral(page: Page):
140132 else :
141133 print ("Advance FOBT Screening Episode Button is disabled, skipping click." )
142134
143- # Step 6 : Assert that the "Record Diagnosis Date" option is not available
135+ # Step 3 : Assert that the "Record Diagnosis Date" option is not available
144136 subject_event_s2 = SubjectEpisodeEventsAndNotesPage (page )
145137 assert (
146138 not subject_event_s2 .is_record_diagnosis_date_option_available ()
@@ -152,35 +144,17 @@ def test_cannot_record_diagnosis_date_without_referral(page: Page):
152144@pytest .mark .vpn_required
153145@pytest .mark .fobt_diagnosis_date_entry
154146def test_cannot_record_diagnosis_date_with_existing_diagnosis (page : Page ):
155- # Step 1: Obtain NHS number for a subject matching criteria
147+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
156148 criteria = {
157149 "latest episode type" : "FOBT" ,
158150 "latest episode status" : "Open" ,
159151 "latest episode has referral date" : "Past" ,
160152 "latest episode has diagnosis date" : "Yes" ,
161153 "latest episode diagnosis date reason" : "NULL" ,
162154 }
163- user = User ()
164- subject = Subject ()
165- builder = SubjectSelectionQueryBuilder ()
166- query , bind_vars = builder .build_subject_selection_query (
167- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
168- )
169- df = OracleDB ().execute_query (query , bind_vars )
170- if df .empty :
171- raise ValueError ("No matching subject found with provided episode criteria." )
155+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
172156
173- # Step 2: Login and search for subject
174- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
175- BasePage (page ).go_to_screening_subject_search_page ()
176-
177- # Step 3: Select episode radio button
178- page .get_by_role ("radio" , name = "Episodes" ).check ()
179-
180- # Step 4: Search subject and go to profile
181- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
182-
183- # Step 5: Interact with subject page
157+ # Step 2: Interact with subject page
184158 advance_fobt_button_s3 = page .get_by_role (
185159 "button" , name = "Advance FOBT Screening Episode"
186160 )
@@ -199,7 +173,7 @@ def test_cannot_record_diagnosis_date_with_existing_diagnosis(page: Page):
199173 else :
200174 print ("Record Diagnosis Date button is not available, skipping click." )
201175
202- # Step 6 : Assert that the "Record Diagnosis Date" option is not available
176+ # Step 3 : Assert that the "Record Diagnosis Date" option is not available
203177 subject_event_s3 = SubjectEpisodeEventsAndNotesPage (page )
204178 assert (
205179 not subject_event_s3 .is_record_diagnosis_date_option_available ()
@@ -278,41 +252,26 @@ def test_hub_user_can_record_diagnosis_date_with_referral_no_diag(page: Page):
278252@pytest .mark .vpn_required
279253@pytest .mark .fobt_diagnosis_date_entry
280254def test_record_diagnosis_date_no_date_or_reason_alert (page : Page ):
281- # Step 1: Obtain NHS number for a subject matching criteria
255+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
282256 criteria = {
283257 "latest episode type" : "FOBT" ,
284258 "latest episode status" : "Open" ,
285259 "latest episode has referral date" : "Past" ,
286260 "latest episode has diagnosis date" : "No" ,
287261 "latest episode diagnosis date reason" : "NULL" ,
288262 }
289- user = User ()
290- subject = Subject ()
291- builder = SubjectSelectionQueryBuilder ()
292- query , bind_vars = builder .build_subject_selection_query (
293- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
294- )
295- df = OracleDB ().execute_query (query , bind_vars )
296- if df .empty :
297- raise ValueError ("No matching subject found with provided episode criteria." )
298-
299- # Step 2: Login and search for subject
300- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
301- BasePage (page ).go_to_screening_subject_search_page ()
302-
303- # Step 3: Search subject and go to profile
304- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
263+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
305264
306- # Step 4 : Interact with subject page
265+ # Step 2 : Interact with subject page
307266 subject_page_s5 = RecordDiagnosisDatePage (page )
308267 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
309268 page .get_by_role ("button" , name = "Record Diagnosis Date" ).click ()
310269 subject_page_s5 .click_save_button ()
311270
312- # Step 5 : Do not enter a diagnosis date or reason
271+ # Step 3 : Do not enter a diagnosis date or reason
313272 time .sleep (2 ) # Pause for 2 seconds to let the process complete
314273
315- # Step 6 : Assertions
274+ # Step 4 : Assertions
316275 alert_message = subject_page_s5 .get_alert_message ()
317276 assert (
318277 "must not be earlier than the referral date" in alert_message
@@ -324,32 +283,17 @@ def test_record_diagnosis_date_no_date_or_reason_alert(page: Page):
324283@pytest .mark .vpn_required
325284@pytest .mark .fobt_diagnosis_date_entry
326285def test_record_diagnosis_date_reason_only (page : Page ):
327- # Step 1: Obtain NHS number for a subject matching criteria
286+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
328287 criteria = {
329288 "latest episode type" : "FOBT" ,
330289 "latest episode status" : "Open" ,
331290 "latest episode has referral date" : "Past" ,
332291 "latest episode has diagnosis date" : "No" ,
333292 "latest episode diagnosis date reason" : "NULL" ,
334293 }
335- user = User ()
336- subject = Subject ()
337- builder = SubjectSelectionQueryBuilder ()
338- query , bind_vars = builder .build_subject_selection_query (
339- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
340- )
341- df = OracleDB ().execute_query (query , bind_vars )
342- if df .empty :
343- raise ValueError ("No matching subject found with provided episode criteria." )
294+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
344295
345- # Step 2: Login and search for subject
346- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
347- BasePage (page ).go_to_screening_subject_search_page ()
348-
349- # Step 3: Search subject and go to profile
350- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
351-
352- # Step 4: Interact with subject page
296+ # Step 2: Interact with subject page
353297 subject_page_s6 = RecordDiagnosisDatePage (page )
354298 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
355299 page .get_by_role ("button" , name = "Record Diagnosis Date" ).click ()
@@ -372,24 +316,9 @@ def test_amend_diagnosis_date_without_reason_alert(page: Page):
372316 "latest episode has diagnosis date" : "No" ,
373317 "latest episode diagnosis date reason" : "NULL" ,
374318 }
375- user = User ()
376- subject = Subject ()
377- builder = SubjectSelectionQueryBuilder ()
378- query , bind_vars = builder .build_subject_selection_query (
379- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
380- )
381- df = OracleDB ().execute_query (query , bind_vars )
382- if df .empty :
383- raise ValueError ("No matching subject found with provided episode criteria." )
384-
385- # Step 2: Login and search for subject
386- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
387- BasePage (page ).go_to_screening_subject_search_page ()
388-
389- # Step 3: Search subject and go to profile
390- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
319+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
391320
392- # Step 4 : Interact with subject page
321+ # Step 2 : Interact with subject page
393322 subject_page_s8 = RecordDiagnosisDatePage (page )
394323 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
395324 page .get_by_role ("button" , name = "Record Diagnosis Date" ).click ()
@@ -401,7 +330,7 @@ def test_amend_diagnosis_date_without_reason_alert(page: Page):
401330 page .get_by_role ("link" , name = "List Episodes" ).click ()
402331 page .get_by_role ("link" , name = "events" ).click ()
403332
404- # Step 5 : Assert that the "Record Diagnosis Date" option is available
333+ # Step 3 : Assert that the "Record Diagnosis Date" option is available
405334 subject_event_s8 = SubjectEpisodeEventsAndNotesPage (page )
406335 event_details = subject_event_s8 .get_latest_event_details ()
407336 assert "A50" not in event_details ["latest_event_status" ]
@@ -545,32 +474,20 @@ def get_diagnosis_reason():
545474@pytest .mark .vpn_required
546475@pytest .mark .fobt_diagnosis_date_entry
547476def test_amend_diagnosis_date_no_change_alert (page : Page ):
548- # Step 1: Obtain NHS number for a subject matching criteria
477+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
549478 criteria = {
550479 "latest episode type" : "FOBT" ,
551480 "latest episode status" : "Open" ,
552481 "latest episode has referral date" : "Past" ,
553482 "latest episode has diagnosis date" : "Yes" ,
554483 "latest episode diagnosis date reason" : "NULL" ,
555484 }
556- user = User ()
557- subject = Subject ()
558- builder = SubjectSelectionQueryBuilder ()
559- query , bind_vars = builder .build_subject_selection_query (
560- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
561- )
562- df = OracleDB ().execute_query (query , bind_vars )
563- if df .empty :
564- raise ValueError ("No matching subject found with provided episode criteria." )
485+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
565486
566- # Step 2: Login and search for subject
567- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
568- BasePage (page ).go_to_screening_subject_search_page ()
569-
570- # Step 3: Search subject and go to profile
487+ # Step 2: Search subject and go to profile
571488 search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
572489
573- # Step 4 : Interact with subject page
490+ # Step 3 : Interact with subject page
574491 subject_page_s11 = RecordDiagnosisDatePage (page )
575492 page .get_by_role ("button" , name = "Advance FOBT Screening Episode" ).click ()
576493 page .get_by_role ("checkbox" ).check ()
@@ -739,7 +656,7 @@ def test_hub_user_cannot_amend_diagnosis_date(page: Page):
739656@pytest .mark .vpn_required
740657@pytest .mark .fobt_diagnosis_date_entry
741658def test_record_and_amend_diagnosis_date_multiple_times (page : Page ):
742- # Step 1: Obtain NHS number for a subject matching criteria
659+ # Step 1: # Query subject by criteria, log in, navigate to search page, select "Episodes" radio button, and open subject profile
743660 criteria = {
744661 "latest episode type" : "FOBT" ,
745662 "latest episode status" : "Open" ,
@@ -749,25 +666,7 @@ def test_record_and_amend_diagnosis_date_multiple_times(page: Page):
749666 }
750667 amend_reason = "Incorrect information previously entered"
751668 remove_reason = "Patient choice"
752- user = User ()
753- subject = Subject ()
754- builder = SubjectSelectionQueryBuilder ()
755- query , bind_vars = builder .build_subject_selection_query (
756- criteria = criteria , user = user , subject = subject , subjects_to_retrieve = 1
757- )
758- df = OracleDB ().execute_query (query , bind_vars )
759- if df .empty :
760- raise ValueError ("No matching subject found with provided episode criteria." )
761-
762- # Step 2: Login and search for subject
763- UserTools .user_login (page , "Screening Centre Manager at BCS001" )
764- BasePage (page ).go_to_screening_subject_search_page ()
765-
766- # Step 3: Select episode radio button
767- page .get_by_role ("radio" , name = "Episodes" ).check ()
768-
769- # Step 4: Search subject and go to profile
770- search_subject_episode_by_nhs_number (page , df .iloc [0 ]["subject_nhs_number" ])
669+ prepare_subject_for_test (page , criteria , role = "Screening Centre Manager at BCS001" )
771670 subject_page_s15 = RecordDiagnosisDatePage (page )
772671
773672 # --- First: Record Diagnosis Date (today) ---
0 commit comments