Skip to content

Commit 6eff021

Browse files
Initial commit
1 parent 7842110 commit 6eff021

File tree

4 files changed

+256
-3
lines changed

4 files changed

+256
-3
lines changed

pages/screening_subject_search/subject_demographic_page.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,41 @@ def __init__(self, page: Page):
1818
self.update_subject_data_button = self.page.get_by_role(
1919
"button", name="Update Subject Data"
2020
)
21+
self.temporary_address_show_link = (
22+
self.page.locator("font")
23+
.filter(has_text="Temporary Address show")
24+
.get_by_role("link")
25+
)
26+
self.temporary_address_valid_from_calendar_button = self.page.locator(
27+
"#UI_SUBJECT_ALT_FROM_0_LinkOrButton"
28+
)
29+
self.temporary_address_valid_to_calendar_button = self.page.locator(
30+
"#UI_SUBJECT_ALT_TO_0_LinkOrButton"
31+
)
32+
self.temporary_address_valid_from_text_box = self.page.get_by_role(
33+
"textbox", name="Valid from"
34+
)
35+
self.temporary_address_valid_to_text_box = self.page.get_by_role(
36+
"textbox", name="Valid to"
37+
)
38+
self.temporary_address_address_line_1 = self.page.locator(
39+
"#UI_SUBJECT_ALT_ADDR1_0"
40+
)
41+
self.temporary_address_address_line_2 = self.page.locator(
42+
"#UI_SUBJECT_ALT_ADDR2_0"
43+
)
44+
self.temporary_address_address_line_3 = self.page.locator(
45+
"#UI_SUBJECT_ALT_ADDR3_0"
46+
)
47+
self.temporary_address_address_line_4 = self.page.locator(
48+
"#UI_SUBJECT_ALT_ADDR4_0"
49+
)
50+
self.temporary_address_address_line_5 = self.page.locator(
51+
"#UI_SUBJECT_ALT_ADDR5_0"
52+
)
53+
self.temporary_address_postcode = self.page.get_by_role(
54+
"row", name="Postcode", exact=True
55+
).get_by_label("Postcode")
2156

2257
def is_forename_filled(self) -> bool:
2358
"""
@@ -99,3 +134,52 @@ def get_dob_field_value(self) -> str:
99134
str: The subject's date of birth as a string
100135
"""
101136
return self.dob_field.input_value()
137+
138+
def update_temporary_address(self, dict: dict) -> None:
139+
"""
140+
Updates the temporary address fields with the provided dictionary values.
141+
Args:
142+
dict (dict): A dictionary containing the temporary address details.
143+
Expected keys: 'valid_from', 'valid_to', 'address_line_1',
144+
'address_line_2', 'address_line_3', 'address_line_4', 'address_line_5'.
145+
"""
146+
if not dict:
147+
raise ValueError("The 'dict' argument cannot be None or empty")
148+
149+
# Click the link to show the temporary address fields
150+
self.click(self.temporary_address_show_link)
151+
152+
# Update the valid from date
153+
if "valid_from" in dict:
154+
if dict["valid_from"] is None:
155+
self.temporary_address_valid_from_text_box.fill("")
156+
else:
157+
self.temporary_address_valid_from_calendar_button.click()
158+
CalendarPicker(self.page).v1_calender_picker(dict["valid_from"])
159+
160+
# Update the valid to date
161+
if "valid_to" in dict:
162+
if dict["valid_to"] is None:
163+
self.temporary_address_valid_to_text_box.fill("")
164+
else:
165+
self.temporary_address_valid_to_calendar_button.click()
166+
CalendarPicker(self.page).v1_calender_picker(dict["valid_to"])
167+
168+
# Fill in the address lines
169+
if "address_line_1" in dict:
170+
self.temporary_address_address_line_1.fill(dict["address_line_1"])
171+
if "address_line_2" in dict:
172+
self.temporary_address_address_line_2.fill(dict["address_line_2"])
173+
if "address_line_3" in dict:
174+
self.temporary_address_address_line_3.fill(dict["address_line_3"])
175+
if "address_line_4" in dict:
176+
self.temporary_address_address_line_4.fill(dict["address_line_4"])
177+
if "address_line_5" in dict:
178+
self.temporary_address_address_line_5.fill(dict["address_line_5"])
179+
180+
# Fill in the postcode
181+
if "postcode" in dict:
182+
self.temporary_address_postcode.fill(dict["postcode"])
183+
184+
# Click the update subject data button to save changes
185+
self.update_subject_data_button.click()

pages/screening_subject_search/subject_screening_summary_page.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ def __init__(self, page: Page):
5454
self.advance_fobt_screening_episode_button = self.page.get_by_role(
5555
"button", name="Advance FOBT Screening Episode"
5656
)
57+
self.temporary_address_icon = self.page.get_by_role(
58+
"link", name="The person has a current"
59+
)
60+
self.temporary_address_popup = self.page.locator("#idTempAddress")
5761

5862
def wait_for_page_title(self) -> None:
5963
"""Waits for the page to be the Subject Screening Summary"""
@@ -71,9 +75,7 @@ def verify_subject_search_results_title_subject_screening_summary(self) -> None:
7175

7276
def verify_subject_search_results_title_subject_search_results(self) -> None:
7377
"""Verify that the subject search results title contains 'Subject Search Results'."""
74-
self.bowel_cancer_screening_page_title_contains_text(
75-
"Subject Search Results"
76-
)
78+
self.bowel_cancer_screening_page_title_contains_text("Subject Search Results")
7779

7880
def get_latest_event_status_cell(self, latest_event_status: str) -> Locator:
7981
"""Get the latest event status cell by its name."""
@@ -192,6 +194,26 @@ def click_advance_fobt_screening_episode_button(self) -> None:
192194
except Exception as e:
193195
pytest.fail(f"Unable to advance the episode: {e}")
194196

197+
def verify_temporary_address_popup_visible(self) -> None:
198+
"""Verify that the temporary address popup is visible."""
199+
try:
200+
expect(self.temporary_address_popup).to_be_visible()
201+
logging.info("Temporary address popup is visible")
202+
except Exception as e:
203+
pytest.fail(f"Temporary address popup is not visible: {e}")
204+
205+
def click_temporary_address_icon(self) -> None:
206+
"""Click on the temporary address icon."""
207+
self.click(self.temporary_address_icon)
208+
209+
def verify_temporary_address_icon_visible(self) -> None:
210+
"""Verify that the temporary address icon is visible."""
211+
try:
212+
expect(self.temporary_address_icon).to_be_visible()
213+
logging.info("Temporary address icon is visible")
214+
except Exception as e:
215+
pytest.fail(f"Temporary address icon is not visible: {e}")
216+
195217

196218
class ChangeScreeningStatusOptions(Enum):
197219
"""Enum for Change Screening Status options."""
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import pytest
2+
from playwright.sync_api import Page
3+
from utils.user_tools import UserTools
4+
from pages.base_page import BasePage
5+
from pages.screening_subject_search.subject_demographic_page import (
6+
SubjectDemographicPage,
7+
)
8+
from pages.screening_subject_search.subject_screening_summary_page import (
9+
SubjectScreeningSummaryPage,
10+
)
11+
from utils.screening_subject_page_searcher import (
12+
search_subject_demographics_by_nhs_number,
13+
search_subject_by_nhs_number,
14+
)
15+
from utils.oracle.oracle import OracleDB
16+
import logging
17+
from faker import Faker
18+
from datetime import datetime, timedelta
19+
20+
21+
@pytest.mark.regression
22+
@pytest.mark.subject_tests
23+
@pytest.mark.wip
24+
def test_not_amending_temporary_address(page: Page):
25+
""" """
26+
27+
# Screening Centre Manager - State Registered (England)
28+
UserTools.user_login(page, "Screening Centre Manager at BCS001")
29+
30+
# Navigate to the Subject Search Criteria Page
31+
BasePage(page).go_to_screening_subject_search_page()
32+
33+
# Search for a subject's demographics by NHS Number
34+
nhs_no = "9322895063"
35+
search_subject_demographics_by_nhs_number(page, nhs_no)
36+
37+
# Update the subject's postcode
38+
fake = Faker("en_GB")
39+
random_postcode = fake.postcode()
40+
SubjectDemographicPage(page).fill_postcode_input(random_postcode)
41+
SubjectDemographicPage(page).postcode_field.press("Tab")
42+
SubjectDemographicPage(page).click_update_subject_data_button()
43+
44+
df = OracleDB().execute_query(
45+
"""
46+
SELECT
47+
ss.subject_nhs_number, adds.address_type, adds.effective_from
48+
FROM screening_subject_t ss
49+
INNER JOIN sd_contact_t c ON c.nhs_number = ss.subject_nhs_number
50+
INNER JOIN sd_address_t adds ON adds.contact_id = c.contact_id
51+
WHERE ss.subject_nhs_number = :nhs_no
52+
""",
53+
{"nhs_no": nhs_no},
54+
)
55+
56+
for address_type in df["address_type"]:
57+
logging.info(f"Address Type: {address_type}")
58+
try:
59+
assert int(df["address_type"].iloc[address_type]) != 13043
60+
except AssertionError:
61+
logging.error(
62+
f"Test Failed - Subject has a temporary address: {df['address_type'].iloc[0]}\n{AssertionError}"
63+
)
64+
65+
66+
@pytest.mark.regression
67+
@pytest.mark.subject_tests
68+
def test_add_temporyay_address_then_delete(page: Page):
69+
""" """
70+
71+
# Screening Centre Manager - State Registered (England)
72+
UserTools.user_login(page, "Screening Centre Manager at BCS001")
73+
74+
# Navigate to the
75+
BasePage(page).go_to_screening_subject_search_page()
76+
# Search for a subject's demographics by NHS Number
77+
nhs_no = "9322895063"
78+
search_subject_demographics_by_nhs_number(page, nhs_no)
79+
# Add a temporary address
80+
temp_address = {
81+
"valid_from": datetime.today(),
82+
"valid_to": datetime.today() + timedelta(days=31),
83+
"address_line_1": "Temporary Address Line 1",
84+
"address_line_2": "Temporary Address Line 2",
85+
"address_line_3": "Temporary Address Line 3",
86+
"address_line_4": "Temporary Address Line 4",
87+
"address_line_5": "Temporary Address Line 5",
88+
"postcode": "AB12 3CD",
89+
}
90+
SubjectDemographicPage(page).update_temporary_address(temp_address)
91+
SubjectDemographicPage(page).click_back_button()
92+
search_subject_by_nhs_number(page, nhs_no)
93+
SubjectScreeningSummaryPage(page).verify_temporary_address_icon_visible()
94+
SubjectScreeningSummaryPage(page).click_temporary_address_icon()
95+
SubjectScreeningSummaryPage(page).verify_temporary_address_popup_visible()
96+
97+
# Delete the temporary address
98+
temp_address = {
99+
"valid_from": None,
100+
"valid_to": None,
101+
"address_line_1": "",
102+
"address_line_2": "",
103+
"address_line_3": "",
104+
"address_line_4": "",
105+
"address_line_5": "",
106+
"postcode": "",
107+
}
108+
SubjectDemographicPage(page).update_temporary_address(temp_address)
109+
110+
df = OracleDB().execute_query(
111+
"""
112+
SELECT
113+
ss.subject_nhs_number, adds.address_type, adds.effective_from
114+
FROM screening_subject_t ss
115+
INNER JOIN sd_contact_t c ON c.nhs_number = ss.subject_nhs_number
116+
INNER JOIN sd_address_t adds ON adds.contact_id = c.contact_id
117+
WHERE ss.subject_nhs_number = :nhs_no
118+
""",
119+
{"nhs_no": nhs_no},
120+
)
121+
122+
try:
123+
assert int(df["address_type"].iloc[0]) != 13043
124+
logging.info("Test Passed - Subject does not have a temporary address")
125+
except AssertionError:
126+
logging.error(
127+
f"Test Failed - Subject has a temporary address: {df['address_type'].iloc[0]}\n{AssertionError}"
128+
)

utils/screening_subject_page_searcher.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,22 @@ def check_clear_filters_button_works(page: Page, nhs_number: str) -> None:
193193
expect(SubjectScreeningPage(page).nhs_number_filter).to_have_value(nhs_number)
194194
SubjectScreeningPage(page).click_clear_filters_button()
195195
expect(SubjectScreeningPage(page).nhs_number_filter).to_be_empty()
196+
197+
198+
def search_subject_demographics_by_nhs_number(page: Page, nhs_number: str) -> None:
199+
"""
200+
This searches for a subject by their NHS Number and checks the page has redirected accordingly
201+
202+
Args:
203+
page (Page): This is the playwright page object
204+
nhs_number (str): The screening subject's nhs number
205+
"""
206+
SubjectScreeningPage(page).click_clear_filters_button()
207+
SubjectScreeningPage(page).click_demographics_filter()
208+
SubjectScreeningPage(page).click_nhs_number_filter()
209+
SubjectScreeningPage(page).nhs_number_filter.fill(nhs_number)
210+
SubjectScreeningPage(page).nhs_number_filter.press("Tab")
211+
SubjectScreeningPage(page).select_search_area_option(
212+
SearchAreaSearchOptions.SEARCH_AREA_WHOLE_DATABASE.value
213+
)
214+
SubjectScreeningPage(page).click_search_button()

0 commit comments

Comments
 (0)