Skip to content

Commit 7580477

Browse files
Completing scenario 18
1 parent 5a7af62 commit 7580477

14 files changed

+1526
-37
lines changed

pages/screening_subject_search/advance_fobt_screening_episode_page.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ def __init__(self, page: Page):
3737
self.invite_for_diagnostic_test_button = self.page.get_by_role(
3838
"button", name="Invite for Diagnostic Test >>"
3939
)
40+
self.cancer_result_refer_mdt_button = self.page.get_by_role(
41+
"button", name="Cancer Result, Refer MDT >>"
42+
)
4043
self.attend_diagnostic_test_button = self.page.get_by_role(
4144
"button", name="Attend Diagnostic Test"
4245
)
@@ -136,6 +139,10 @@ def __init__(self, page: Page):
136139
"button", name="Redirect to Establish Attendance at Appointment"
137140
)
138141
)
142+
self.date_of_symptomatic_procedure_input = self.page.get_by_role(
143+
"textbox", name="Date of Symptomatic Procedure"
144+
)
145+
139146
# Contact recording locators
140147
self.contact_direction_dropdown = self.page.get_by_label("Contact Direction")
141148
self.contact_made_between_dropdown = self.page.get_by_label(
@@ -150,6 +157,7 @@ def __init__(self, page: Page):
150157
self.patient_contacted_dropdown = self.page.get_by_label("Patient Contacted")
151158
self.outcome_dropdown = self.page.get_by_label("Outcome")
152159
self.save_button = self.page.locator("input[name='UI_BUTTON_SAVE']")
160+
153161
# CT Colonography invitation locators
154162
self.ct_colonography_appointment_date_input = self.page.locator(
155163
"#UI_APPT_DATE_38"
@@ -177,6 +185,10 @@ def click_invite_for_diagnostic_test_button(self) -> None:
177185
"""Click the 'Invite for Diagnostic Test' button."""
178186
self.safe_accept_dialog(self.invite_for_diagnostic_test_button)
179187

188+
def click_cancer_result_refer_mdt_button(self) -> None:
189+
"""Click the 'Cancer Result, Refer MDT >>' button."""
190+
self.safe_accept_dialog(self.cancer_result_refer_mdt_button)
191+
180192
def click_attend_diagnostic_test_button(self) -> None:
181193
"""Click the 'Attend Diagnostic Test' button."""
182194
self.click(self.attend_diagnostic_test_button)
@@ -498,3 +510,13 @@ def click_redirect_to_establish_attendance_at_appointment_button(
498510
self.safe_accept_dialog(
499511
self.redirect_to_establish_attendance_at_appointment_button
500512
)
513+
514+
def enter_date_of_symptomatic_procedure(self, date: datetime) -> None:
515+
"""
516+
Enter a date of symptomatic procedure.
517+
Args:
518+
date (datetime): The date to enter
519+
"""
520+
CalendarPicker(self.page).calendar_picker_ddmmyyyy(
521+
date, self.date_of_symptomatic_procedure_input
522+
)

pages/screening_subject_search/close_fobt_screening_episode_page.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ def close_fobt_screening_episode(self, reason_text: str) -> None:
3232

3333
# Step 4: Click final 'Close Episode' button
3434
self.safe_accept_dialog(self.final_close_button)
35+
36+
self.page.wait_for_timeout(500) # Timeout to allow subject to be updated on DB.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
4+
5+
class ConfirmTheManualSendingOfADisclaimerLetterPage(BasePage):
6+
"""Confirm The Manual Sending Of A Disclaimer Letter Page locators, and methods for interacting with the page."""
7+
8+
def __init__(self, page: Page):
9+
super().__init__(page)
10+
self.page = page
11+
12+
# Confirm The Manual Sending Of A Disclaimer Letter - page locators
13+
self.confirm_button = self.page.get_by_role("button", name="Confirm")
14+
15+
def click_confirm_button(self) -> None:
16+
"""Click the 'Confirm' button."""
17+
self.click(self.confirm_button)

pages/screening_subject_search/handover_into_symptomatic_care_page.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from playwright.sync_api import Page
22
from pages.base_page import BasePage
3+
from datetime import datetime
4+
from utils.calendar_picker import CalendarPicker
35

46

57
class HandoverIntoSymptomaticCarePage(BasePage):
@@ -18,6 +20,8 @@ def __init__(self, page: Page):
1820
self.cease_from_program_dropdown = self.page.locator(
1921
"#UI_CEASE_FROM_PROGRAM_ID"
2022
)
23+
self.mdt_date_field = self.page.locator("#UI_MDT_DATE")
24+
self.site_dropdown = self.page.locator("#UI_NS_SITE_SELECT_LINK")
2125

2226
def select_referral_dropdown_option(self, value: str) -> None:
2327
"""
@@ -75,3 +79,42 @@ def select_cease_from_program(self, cease: bool) -> None:
7579
"""
7680
value = "Yes" if cease else "No"
7781
self.cease_from_program_dropdown.select_option(value)
82+
83+
def enter_mdt_date(self, date: datetime) -> None:
84+
"""
85+
Enters a date into the 'MDT Date' field
86+
Args:
87+
date (datetime): The date to enter.
88+
"""
89+
CalendarPicker(self.page).calendar_picker_ddmmyyyy(date, self.mdt_date_field)
90+
91+
def select_site_dropdown_option_index(self, index: int) -> None:
92+
"""
93+
Select a given option from the site dropdown.
94+
95+
Args:
96+
value (str): The value of the option you want to select
97+
"""
98+
self.click(self.site_dropdown)
99+
select_locator = self.page.locator('select[id^="UI_RESULTS_"]:visible')
100+
select_locator.first.wait_for(state="visible")
101+
102+
# Find all option elements inside the select and click the one at the given index
103+
option_elements = select_locator.first.locator("option")
104+
option_elements.nth(index).wait_for(state="visible")
105+
self.click(option_elements.nth(index))
106+
107+
def fill_with_cancer_details(self) -> None:
108+
"""
109+
Complete the Handover into Symptomatic Care form with the cancer details scenario:
110+
MDT Date: Today
111+
Site: Last option
112+
Screening Practitioner: 1st option
113+
Note: Handover notes for Cancer scenario
114+
"""
115+
self.enter_mdt_date(datetime.today())
116+
self.select_site_dropdown_option_index(-1)
117+
self.select_practitioner_from_index(1)
118+
self.fill_notes("Handover notes for Cancer scenario")
119+
self.click_save_button()
120+
self.page.wait_for_timeout(500) # Timeout to allow subject to update in the DB.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
from datetime import datetime
4+
from utils.calendar_picker import CalendarPicker
5+
6+
7+
class RecordInformedDissentPage(BasePage):
8+
"""Record Informed Dissent Page locators, and methods for interacting with the page."""
9+
10+
def __init__(self, page: Page):
11+
super().__init__(page)
12+
self.page = page
13+
14+
# Record informed Dissent - page locators
15+
self.notes_field = self.page.locator("#UI_NOTES_TEXT")
16+
self.date_confimed_input = self.page.locator("#UI_CEASING_CONFIRM_DATE")
17+
self.confirm_cease_button = self.page.get_by_role(
18+
"button", name="Confirm Cease"
19+
)
20+
21+
def fill_notes_field(self, note: str) -> None:
22+
"""
23+
Fill the notes field.
24+
Args:
25+
note (str): The note to add.
26+
"""
27+
self.notes_field.fill(note)
28+
29+
def enter_date_confirmed(self, date: datetime) -> None:
30+
"""
31+
Enter date confirmed
32+
Args:
33+
date (datetime): The date to enter
34+
"""
35+
CalendarPicker(self.page).calendar_picker_ddmmyyyy(
36+
date, self.date_confimed_input
37+
)
38+
39+
def click_confirm_cease_button(self) -> None:
40+
"""Click the 'Confirm Cease' button."""
41+
self.safe_accept_dialog(self.confirm_cease_button)
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
from enum import Enum
4+
from utils.calendar_picker import CalendarPicker
5+
from datetime import datetime
6+
from pages.screening_subject_search.subject_screening_summary_page import (
7+
SubjectScreeningSummaryPage,
8+
)
9+
from pages.screening_subject_search.confirm_the_manual_sending_of_a_disclaimer_letter_page import (
10+
ConfirmTheManualSendingOfADisclaimerLetterPage,
11+
)
12+
from pages.screening_subject_search.record_informed_dissent_page import (
13+
RecordInformedDissentPage,
14+
)
15+
16+
17+
class RecordRequestToCeasePage(BasePage):
18+
"""Record Request To Cease Page locators, and methods for interacting with the page."""
19+
20+
def __init__(self, page: Page):
21+
super().__init__(page)
22+
self.page = page
23+
24+
# Record Request To Cease - page locators
25+
self.reason_dropdown = self.page.locator("#A_C_RequestCeaseReason")
26+
self.save_request_cease_button = self.page.get_by_role(
27+
"button", name="Save Request Cease"
28+
)
29+
self.confirm_cease_button = self.page.get_by_role(
30+
"button", name="Confirm Cease"
31+
)
32+
self.cease_notes = self.page.locator("#UI_NOTES_TEXT")
33+
self.cease_date_confirmed_textbox = self.page.locator(
34+
"#UI_CEASING_CONFIRM_DATE"
35+
)
36+
37+
def select_request_cease_reason(self, cease_reason: "ReasonForCeasing") -> None:
38+
"""
39+
Selects a request cease option.
40+
Args:
41+
cease_reason (ReasonForCeasing): The reason to request cease
42+
"""
43+
self.reason_dropdown.select_option(label=cease_reason.reason)
44+
45+
def click_save_request_cease_button(self) -> None:
46+
"""Click the 'Save Request Cease' button."""
47+
self.click(self.save_request_cease_button)
48+
self.page.wait_for_timeout(
49+
500
50+
) # Timeout to allow time for the subject to be updated on the DB.
51+
52+
def fill_cease_notes(self, note: str) -> None:
53+
"""
54+
Enter a Note in the cease notes
55+
Args:
56+
note (str): The note to add.
57+
"""
58+
self.cease_notes.fill(note)
59+
60+
def enter_cease_date_confirmed(self, date: datetime) -> None:
61+
"""
62+
Enter cease date confirmed
63+
Args:
64+
date (datetime): The date to enter
65+
"""
66+
CalendarPicker(self.page).calendar_picker_ddmmyyyy(
67+
date, self.cease_date_confirmed_textbox
68+
)
69+
70+
def click_confirm_cease_button(self) -> None:
71+
"""Click the 'Confirm Cease' button."""
72+
self.click(self.confirm_cease_button)
73+
74+
def cease_subject_with_reason(self, reason: str) -> None:
75+
"""
76+
Ceases a subject with a reason
77+
Args:
78+
reason (str): The reason to request cease:
79+
Can be any of the following:
80+
- Informed Dissent
81+
- Informed Dissent (verbal only)
82+
- No Colon (subject request)
83+
- No Colon (programme assessed)
84+
- Informal Death
85+
"""
86+
reason_for_ceasing = ReasonForCeasing.by_description_case_insensitive(reason)
87+
if reason_for_ceasing is None:
88+
raise ValueError("Incorrect reason for cease selected.")
89+
self.select_request_cease_reason(reason_for_ceasing)
90+
91+
if reason_for_ceasing.is_immediate_cease:
92+
self.fill_cease_notes("AUTO TESTING: confirm immediate manual cease")
93+
self.enter_cease_date_confirmed(datetime.now())
94+
self.click_confirm_cease_button()
95+
96+
else:
97+
self.click_save_request_cease_button()
98+
SubjectScreeningSummaryPage(self.page).click_record_disclaimer_letter_sent()
99+
ConfirmTheManualSendingOfADisclaimerLetterPage(
100+
self.page
101+
).click_confirm_button()
102+
SubjectScreeningSummaryPage(
103+
self.page
104+
).click_record_return_of_disclaimer_letter()
105+
RecordInformedDissentPage(self.page).fill_notes_field(
106+
"AUTO TESTING: confirm not-immediate manual cease"
107+
)
108+
RecordInformedDissentPage(self.page).enter_date_confirmed(datetime.now())
109+
RecordInformedDissentPage(self.page).click_confirm_cease_button()
110+
111+
112+
class ReasonForCeasing(Enum):
113+
INFORMED_DISSENT = ("Informed Dissent", 43, False)
114+
INFORMED_DISSENT_VERBAL_ONLY = ("Informed Dissent (verbal only)", 44, True)
115+
NO_COLON_SUBJECT_REQUEST = ("No Colon (subject request)", 45, False)
116+
NO_COLON_PROGRAMME_ASSESSED = ("No Colon (programme assessed)", 46, True)
117+
INFORMAL_DEATH = ("Informal Death", 47, True)
118+
119+
def __init__(self, reason: str, value: int, is_immediate_cease_reason: bool):
120+
self._reason = reason
121+
self._value = value
122+
self._is_immediate_cease_reason = is_immediate_cease_reason
123+
124+
@property
125+
def reason(self) -> str:
126+
return self._reason
127+
128+
@property
129+
def value(self) -> int:
130+
return self._value
131+
132+
@property
133+
def is_immediate_cease(self) -> bool:
134+
return self._is_immediate_cease_reason
135+
136+
@classmethod
137+
def get_by_reason(cls, reason: str):
138+
for member in cls:
139+
if member.reason == reason:
140+
return member
141+
return None
142+
143+
@classmethod
144+
def by_description_case_insensitive(cls, reason: str):
145+
reason_lower = reason.lower()
146+
for member in cls:
147+
if member.reason.lower() == reason_lower:
148+
return member
149+
return None

pages/screening_subject_search/refer_to_mdt_page.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ def __init__(self, page: Page):
1515
self.mdt_discussion_date_field = self.page.locator("#UI_MDT_DATE_LinkOrButton")
1616
self.mdt_location = self.page.locator("#UI_NS_SITE_SELECT_LINK")
1717
self.visible_ui_results_string = 'select[id^="UI_RESULTS_"]:visible'
18-
self.record_MDT_appointment_button = self.page.locator(
18+
self.record_mdt_appointment_button = self.page.locator(
1919
'[name="UI_BUTTON_SAVE"]'
2020
)
2121

22-
def enter_date_in_Mdt_discussion_date_field(self, date: datetime) -> None:
22+
def enter_date_in_mdt_discussion_date_field(self, date: datetime) -> None:
2323
"""
2424
Enters a date in the MDT discussion date field.
2525
Args:
@@ -43,6 +43,6 @@ def select_mdt_location_lookup(self, option: int) -> None:
4343
option_elements.nth(option).wait_for(state="visible")
4444
self.click(option_elements.nth(option))
4545

46-
def click_record_MDT_appointment_button(self) -> None:
46+
def click_record_mdt_appointment_button(self) -> None:
4747
"""Clicks the record MDT appointment button."""
48-
self.click(self.record_MDT_appointment_button)
48+
self.click(self.record_mdt_appointment_button)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
4+
5+
class ReopenScreeningEpisodeAfterManualCeasePage(BasePage):
6+
"""Reopen Screening Episode After Manual Cease Page locators, and methods for interacting with the page."""
7+
8+
def __init__(self, page: Page):
9+
super().__init__(page)
10+
self.page = page
11+
12+
# Reopen Screening Episode After Manual Cease - page locators
13+
self.notes_field = self.page.locator("#UI_NOTES_TEXT")
14+
self.uncease_and_reopen_episode_button = self.page.get_by_role(
15+
"button", name="uncease and reopen Episode"
16+
)
17+
18+
def fill_notes_field(self, note: str) -> None:
19+
"""
20+
Enter a note into the notes field.
21+
Args:
22+
note (str): The note to enter.
23+
"""
24+
self.notes_field.fill(note)
25+
26+
def click_uncease_and_reopen_episode_button(self) -> None:
27+
"""Click the 'uncease and reopen Episode' button."""
28+
self.click(self.uncease_and_reopen_episode_button)

0 commit comments

Comments
 (0)