66from utils .oracle .oracle_specific_functions import SubjectSelector
77from utils .oracle .oracle import OracleDB
88from pages .base_page import BasePage
9+ from pages .manual_cease .manual_cease_page import ManualCeasePage
910from utils import screening_subject_page_searcher
1011from utils .user_tools import UserTools
11- from utils .manual_cease import (
12- process_manual_cease_immediate ,
13- process_manual_cease_with_disclaimer ,
14- verify_manual_cease_db_fields_dynamic ,
15- EXPECT ,
16- )
12+ from utils .manual_cease import EXPECT
1713from utils .manual_cease import (
1814 ScreeningStatus ,
1915 ScreeningStatusReason ,
2016 ScreeningDueDateReason ,
2117 SurveillanceDueDateReason ,
2218)
19+ from utils .manual_cease import ManualCeaseTools
2320from datetime import datetime
2421from typing import Any
2522
@@ -56,7 +53,7 @@ def base_expected_db() -> dict[str, Any]:
5653# These scenarios just check that manually ceasing a subject (either immediately or via a disclaimer letter) from different statuses correctly sets their screening status and status reason.
5754# Screening due date reason is always set to "Ceased" during a manual cease, even if the SDD is not changing.
5855@pytest .mark .vpn_required
59- @pytest .mark .manual_cease
56+ @pytest .mark .manual_cease_tests
6057@pytest .mark .regression
6158def test_manual_cease_from_inactive_subject_for_informed_dissent (
6259 page : Page , base_expected_db
@@ -107,9 +104,7 @@ def test_manual_cease_from_inactive_subject_for_informed_dissent(
107104 "[SUBJECT NOT FOUND] Creating fallback subject for manual cease"
108105 )
109106
110- from utils .manual_cease import create_manual_cease_ready_subject
111-
112- nhs_number = create_manual_cease_ready_subject (
107+ nhs_number = ManualCeaseTools .create_manual_cease_ready_subject (
113108 screening_centre = user_details ["hub_code" ], base_age = 75
114109 )
115110
@@ -120,19 +115,22 @@ def test_manual_cease_from_inactive_subject_for_informed_dissent(
120115 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
121116
122117 # Manually cease subject with specified reason
123- process_manual_cease_with_disclaimer (page , reason = "Informed Dissent" )
118+ manual_cease_page = ManualCeasePage (page )
119+ ManualCeaseTools .process_manual_cease_with_disclaimer (
120+ manual_cease_page , reason = "Informed Dissent"
121+ )
124122 logging .info ("[CEASE ACTION] Manual cease triggered" )
125123
126124 # Perform UI field assertions
127125 today = datetime .today ().strftime ("%d/%m/%Y" ) # Get today's date in required format
128126
129127 # Define the shared locator
130- summary_table = page . locator ( "#screeningSummaryTable" )
128+ manual_cease_page = ManualCeasePage ( page )
131129
132130 # UI Assertions
133- expect (summary_table ).to_contain_text ("Ceased" )
134- expect (summary_table ).to_contain_text ("Informed Dissent" )
135- expect (summary_table ).to_contain_text (today )
131+ expect (manual_cease_page . summary_table ).to_contain_text ("Ceased" )
132+ expect (manual_cease_page . summary_table ).to_contain_text ("Informed Dissent" )
133+ expect (manual_cease_page . summary_table ).to_contain_text (today )
136134
137135 # DB assertions
138136 expected_db = {
@@ -144,12 +142,12 @@ def test_manual_cease_from_inactive_subject_for_informed_dissent(
144142 }
145143
146144 # Fire off the DB asserts
147- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
145+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
148146 logging .info ("[ASSERTIONS COMPLETE] Manual cease scenario validated successfully" )
149147
150148
151149@pytest .mark .vpn_required
152- @pytest .mark .manual_cease
150+ @pytest .mark .manual_cease_tests
153151@pytest .mark .regression
154152def test_manual_cease_from_call_subject_for_informed_dissent_verbal_only (
155153 page : Page , base_expected_db
@@ -209,10 +207,7 @@ def test_manual_cease_from_call_subject_for_informed_dissent_verbal_only(
209207 logging .warning (
210208 "[SUBJECT NOT FOUND] Creating fallback subject for manual cease"
211209 )
212-
213- from utils .manual_cease import create_manual_cease_ready_subject
214-
215- nhs_number = create_manual_cease_ready_subject (
210+ nhs_number = ManualCeaseTools .create_manual_cease_ready_subject (
216211 screening_centre = user_details ["hub_code" ], base_age = 75
217212 )
218213
@@ -223,17 +218,22 @@ def test_manual_cease_from_call_subject_for_informed_dissent_verbal_only(
223218 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
224219
225220 # Manually cease subject with specified reason
226- process_manual_cease_immediate (page , reason = "Informed Dissent (verbal only)" )
221+ manual_cease_page = ManualCeasePage (page )
222+ ManualCeaseTools .process_manual_cease_immediate (
223+ manual_cease_page , reason = "Informed Dissent (verbal only)"
224+ )
227225 logging .info ("[CEASE ACTION] Manual cease triggered" )
228226
229- # Perform UI field assertions
227+ # Define the shared locator and today's date
230228 today = datetime .today ().strftime ("%d/%m/%Y" ) # Get today's date in required format
231- summary_table = page . locator ( "#screeningSummaryTable" )
229+ manual_cease_page = ManualCeasePage ( page )
232230
233231 # UI Assertions
234- expect (summary_table ).to_contain_text ("Ceased" )
235- expect (summary_table ).to_contain_text ("Informed Dissent (verbal only)" )
236- expect (summary_table ).to_contain_text (today )
232+ expect (manual_cease_page .summary_table ).to_contain_text ("Ceased" )
233+ expect (manual_cease_page .summary_table ).to_contain_text (
234+ "Informed Dissent (verbal only)"
235+ )
236+ expect (manual_cease_page .summary_table ).to_contain_text (today )
237237
238238 # DB assertions
239239 expected_db = {
@@ -252,12 +252,12 @@ def test_manual_cease_from_call_subject_for_informed_dissent_verbal_only(
252252 }
253253
254254 # Fire off the DB asserts
255- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
255+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
256256 logging .info ("[ASSERTIONS COMPLETE] Manual cease scenario validated successfully" )
257257
258258
259259@pytest .mark .vpn_required
260- @pytest .mark .manual_cease
260+ @pytest .mark .manual_cease_tests
261261@pytest .mark .regression
262262def test_manual_cease_from_recall_subject_for_no_colon_subject_request (
263263 page : Page , base_expected_db
@@ -319,9 +319,7 @@ def test_manual_cease_from_recall_subject_for_no_colon_subject_request(
319319 logging .warning (
320320 "[SUBJECT NOT FOUND] Creating fallback subject for manual cease"
321321 )
322- from utils .manual_cease import create_manual_cease_ready_subject
323-
324- nhs_number = create_manual_cease_ready_subject (
322+ nhs_number = ManualCeaseTools .create_manual_cease_ready_subject (
325323 screening_centre = user_details ["hub_code" ], base_age = 75
326324 )
327325 logging .info (f"[SUBJECT CREATED] Fallback NHS number: { nhs_number } " )
@@ -331,16 +329,22 @@ def test_manual_cease_from_recall_subject_for_no_colon_subject_request(
331329 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
332330
333331 # Perform manual cease with specified reason
334- process_manual_cease_with_disclaimer (page , reason = "No Colon (subject request)" )
332+ manual_cease_page = ManualCeasePage (page )
333+ ManualCeaseTools .process_manual_cease_with_disclaimer (
334+ manual_cease_page , reason = "No Colon (subject request)"
335+ )
335336 logging .info ("[CEASE ACTION] Manual cease triggered" )
336337
337- # UI assertions
338+ # Define the shared locator and today's date
338339 today = datetime .today ().strftime ("%d/%m/%Y" )
339- summary_table = page . locator ( "#screeningSummaryTable" )
340+ manual_cease_page = ManualCeasePage ( page )
340341
341- expect (summary_table ).to_contain_text ("Ceased" )
342- expect (summary_table ).to_contain_text ("No Colon (subject request)" )
343- expect (summary_table ).to_contain_text (today )
342+ # UI assertions
343+ expect (manual_cease_page .summary_table ).to_contain_text ("Ceased" )
344+ expect (manual_cease_page .summary_table ).to_contain_text (
345+ "No Colon (subject request)"
346+ )
347+ expect (manual_cease_page .summary_table ).to_contain_text (today )
344348
345349 # DB field assertions
346350 expected_db = {
@@ -356,12 +360,12 @@ def test_manual_cease_from_recall_subject_for_no_colon_subject_request(
356360 }
357361
358362 # Fire off the DB assertions
359- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
363+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
360364 logging .info ("[ASSERTIONS COMPLETE] Manual cease scenario validated successfully" )
361365
362366
363367@pytest .mark .vpn_required
364- @pytest .mark .manual_cease
368+ @pytest .mark .manual_cease_tests
365369@pytest .mark .regression
366370def test_manual_cease_from_surveillance_subject_for_no_colon_programme_assessed (
367371 page : Page , base_expected_db
@@ -415,9 +419,8 @@ def test_manual_cease_from_surveillance_subject_for_no_colon_programme_assessed(
415419 logging .info (f"[SUBJECT FOUND] Retrieved NHS number: { nhs_number } " )
416420 except ValueError :
417421 logging .warning ("[SUBJECT NOT FOUND] Creating fallback subject" )
418- from utils .manual_cease import create_manual_cease_ready_subject
419422
420- nhs_number = create_manual_cease_ready_subject (
423+ nhs_number = ManualCeaseTools . create_manual_cease_ready_subject (
421424 screening_centre = user_details ["hub_code" ],
422425 base_age = 76 ,
423426 )
@@ -426,15 +429,22 @@ def test_manual_cease_from_surveillance_subject_for_no_colon_programme_assessed(
426429 screening_subject_page_searcher .search_subject_by_nhs_number (page , nhs_number )
427430 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
428431
429- process_manual_cease_immediate (page , reason = "No Colon (programme assessed)" )
432+ manual_cease_page = ManualCeasePage (page )
433+ ManualCeaseTools .process_manual_cease_immediate (
434+ manual_cease_page , reason = "No Colon (programme assessed)"
435+ )
430436 logging .info ("[CEASE ACTION] Manual cease triggered" )
431437
438+ # Define the shared locator and today's date
432439 today = datetime .today ().strftime ("%d/%m/%Y" )
433- summary_table = page . locator ( "#screeningSummaryTable" )
440+ manual_cease_page = ManualCeasePage ( page )
434441
435- expect (summary_table ).to_contain_text ("Ceased" )
436- expect (summary_table ).to_contain_text ("No Colon (programme assessed)" )
437- expect (summary_table ).to_contain_text (today )
442+ # UI Assertions
443+ expect (manual_cease_page .summary_table ).to_contain_text ("Ceased" )
444+ expect (manual_cease_page .summary_table ).to_contain_text (
445+ "No Colon (programme assessed)"
446+ )
447+ expect (manual_cease_page .summary_table ).to_contain_text (today )
438448
439449 expected_db = {
440450 ** base_expected_db ,
@@ -451,14 +461,14 @@ def test_manual_cease_from_surveillance_subject_for_no_colon_programme_assessed(
451461 "Surveillance due date date of change" : EXPECT .TODAY ,
452462 }
453463
454- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
464+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
455465 logging .info (
456466 "[ASSERTIONS COMPLETE] Surveillance cease scenario validated successfully"
457467 )
458468
459469
460470@pytest .mark .vpn_required
461- @pytest .mark .manual_cease
471+ @pytest .mark .manual_cease_tests
462472@pytest .mark .regression
463473def test_manual_cease_from_already_ceased_subject_for_informal_death (
464474 page : Page , base_expected_db
@@ -515,9 +525,8 @@ def test_manual_cease_from_already_ceased_subject_for_informal_death(
515525 logging .info (f"[SUBJECT FOUND] Retrieved NHS number: { nhs_number } " )
516526 except ValueError :
517527 logging .warning ("[SUBJECT NOT FOUND] Creating fallback ceased subject" )
518- from utils .manual_cease import create_manual_cease_ready_subject
519528
520- nhs_number = create_manual_cease_ready_subject (
529+ nhs_number = ManualCeaseTools . create_manual_cease_ready_subject (
521530 screening_centre = user_details ["hub_code" ],
522531 base_age = 77 ,
523532 )
@@ -526,15 +535,20 @@ def test_manual_cease_from_already_ceased_subject_for_informal_death(
526535 screening_subject_page_searcher .search_subject_by_nhs_number (page , nhs_number )
527536 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
528537
529- process_manual_cease_immediate (page , reason = "Informal Death" )
538+ manual_cease_page = ManualCeasePage (page )
539+ ManualCeaseTools .process_manual_cease_immediate (
540+ manual_cease_page , reason = "Informal Death"
541+ )
530542 logging .info ("[CEASE ACTION] Manual cease triggered" )
531543
544+ # Define the shared locator and today's date
532545 today = datetime .today ().strftime ("%d/%m/%Y" )
533- summary_table = page . locator ( "#screeningSummaryTable" )
546+ manual_cease_page = ManualCeasePage ( page )
534547
535- expect (summary_table ).to_contain_text ("Ceased" )
536- expect (summary_table ).to_contain_text ("Informal Death" )
537- expect (summary_table ).to_contain_text (today )
548+ # UI Assertions
549+ expect (manual_cease_page .summary_table ).to_contain_text ("Ceased" )
550+ expect (manual_cease_page .summary_table ).to_contain_text ("Informal Death" )
551+ expect (manual_cease_page .summary_table ).to_contain_text (today )
538552
539553 expected_db = {
540554 ** base_expected_db ,
@@ -552,14 +566,14 @@ def test_manual_cease_from_already_ceased_subject_for_informal_death(
552566 "Surveillance due date date of change" : EXPECT .UNCHANGED ,
553567 }
554568
555- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
569+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
556570 logging .info (
557571 "[ASSERTIONS COMPLETE] Informal Death cease scenario validated successfully"
558572 )
559573
560574
561575@pytest .mark .vpn_required
562- @pytest .mark .manual_cease
576+ @pytest .mark .manual_cease_tests
563577@pytest .mark .regression
564578def test_manual_cease_from_already_ceased_subject_for_no_colon_subject_request (
565579 page : Page , base_expected_db
@@ -618,9 +632,8 @@ def test_manual_cease_from_already_ceased_subject_for_no_colon_subject_request(
618632 except ValueError :
619633 # If no matching subject exists, create a fallback one
620634 logging .warning ("[SUBJECT NOT FOUND] Creating fallback ceased subject" )
621- from utils .manual_cease import create_manual_cease_ready_subject
622635
623- nhs_number = create_manual_cease_ready_subject (
636+ nhs_number = ManualCeaseTools . create_manual_cease_ready_subject (
624637 screening_centre = user_details ["hub_code" ],
625638 base_age = 75 ,
626639 )
@@ -631,13 +644,20 @@ def test_manual_cease_from_already_ceased_subject_for_no_colon_subject_request(
631644 logging .info ("[SUBJECT VIEW] Subject loaded in UI" )
632645
633646 # Manually cease the subject with the specified reason
634- process_manual_cease_with_disclaimer (page , reason = "No Colon (subject request)" )
647+ manual_cease_page = ManualCeasePage (page )
648+ ManualCeaseTools .process_manual_cease_with_disclaimer (
649+ manual_cease_page , reason = "No Colon (subject request)"
650+ )
635651 logging .info ("[CEASE ACTION] Manual cease triggered" )
636652
637- # Validate UI contains updated cease information
638- summary_table = page .locator ("#screeningSummaryTable" )
639- expect (summary_table ).to_contain_text ("Ceased" )
640- expect (summary_table ).to_contain_text ("No Colon (subject request)" )
653+ # Define shared locator
654+ manual_cease_page = ManualCeasePage (page )
655+
656+ # UI Assertions
657+ expect (manual_cease_page .summary_table ).to_contain_text ("Ceased" )
658+ expect (manual_cease_page .summary_table ).to_contain_text (
659+ "No Colon (subject request)"
660+ )
641661
642662 # Define expected database values post-cease
643663 expected_db = {
@@ -657,5 +677,5 @@ def test_manual_cease_from_already_ceased_subject_for_no_colon_subject_request(
657677 }
658678
659679 # Verify database updates match expected values
660- verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
680+ ManualCeaseTools . verify_manual_cease_db_fields_dynamic (nhs_number , expected_db )
661681 logging .info ("[ASSERTIONS COMPLETE] No Colon cease scenario validated successfully" )
0 commit comments