Skip to content

Commit 204bc34

Browse files
committed
Addressed PR comments
1 parent c79d8aa commit 204bc34

File tree

4 files changed

+323
-275
lines changed

4 files changed

+323
-275
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from playwright.sync_api import Page
2+
3+
4+
class ManualCeasePage:
5+
"""This class contains locators to interact with the manual cease page."""
6+
7+
def __init__(self, page: Page):
8+
self.page = page
9+
self.request_cease_button = page.locator("input[name='BTN_REQUEST_CEASE']")
10+
self.cease_reason_dropdown = page.locator("#A_C_RequestCeaseReason")
11+
self.notes_textbox = page.get_by_role("textbox", name="Notes (up to 500 char)")
12+
self.date_confirmed_field = page.get_by_label("Date Confirmed")
13+
self.confirm_cease_button = page.get_by_role("button", name="Confirm Cease")
14+
self.save_request_cease_button = page.locator(
15+
"input[name='BTN_SAVE'][value='Save Request Cease']"
16+
)
17+
self.summary_table = page.locator("#screeningSummaryTable")
18+
self.record_disclaimer_sent_button = page.get_by_role(
19+
"button", name="Record Disclaimer Letter Sent"
20+
)
21+
self.confirm_disclaimer_sent_button = page.get_by_role("button", name="Confirm")
22+
self.record_return_disclaimer_button = page.get_by_role(
23+
"button", name="Record Return of Disclaimer Letter"
24+
)
25+
self.notes_field = page.get_by_label("Notes")

pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@ markers =
4545
subject_search: tests that are part of the subject search test suite
4646
investigation_dataset_tests: tests that are part of the investigation dataset test suite
4747
skip_before_test: tests that will not use the before_test fixture
48-
manual_cease: tests that are part of the manual cease test suite
48+
manual_cease_tests: tests that are part of the manual cease test suite
4949
fobt_diagnosis_date_entry_tests: tests that are part of fobt subject episodes record diagnosis date

tests/regression/manual_cease/test_manually_cease_a_subject.py

Lines changed: 86 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,17 @@
66
from utils.oracle.oracle_specific_functions import SubjectSelector
77
from utils.oracle.oracle import OracleDB
88
from pages.base_page import BasePage
9+
from pages.manual_cease.manual_cease_page import ManualCeasePage
910
from utils import screening_subject_page_searcher
1011
from 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
1713
from utils.manual_cease import (
1814
ScreeningStatus,
1915
ScreeningStatusReason,
2016
ScreeningDueDateReason,
2117
SurveillanceDueDateReason,
2218
)
19+
from utils.manual_cease import ManualCeaseTools
2320
from datetime import datetime
2421
from 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
6158
def 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
154152
def 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
262262
def 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
366370
def 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
463473
def 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
564578
def 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

Comments
 (0)