Skip to content

Commit 1bed6ea

Browse files
authored
Merge branch 'main' into feature/BCSS-20362-c5-pom-for-colonoscopy-datasets
2 parents 6a54a91 + c1d41de commit 1bed6ea

File tree

9 files changed

+95
-40
lines changed

9 files changed

+95
-40
lines changed

.github/actions/run-playwright-tests/action.yml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ inputs:
88
required: true
99
type: string
1010
marker_to_use:
11-
description: "The test marker to use when running tests (e.g. smokescreen)"
11+
description: "The test marker to use when running tests (e.g. smoke)"
1212
required: true
1313
type: string
1414

@@ -29,13 +29,10 @@ runs:
2929
run: python -m playwright install --with-deps
3030
- name: Run specified tests
3131
shell: bash
32-
run: pytest -m ${{ inputs.marker_to_use }} --base-url=$URL_TO_USE --ignore=tests_utils/
33-
env:
34-
BCSS_PASS: ${{ secrets.BCSS_PASS }}
35-
ORACLE_DB: ${ ${{ secrets.ORACLE_DB }}/<REPLACE>/${{ inputs.bcss_cloud_environment }} }
36-
ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }}
37-
ORACLE_PASS: ${{ secrets.ORACLE_PASS }}
38-
URL_TO_USE: ${ ${{ vars.CLOUD_ENV_URL }}/<REPLACE>/${{ inputs.bcss_cloud_environment }} }
32+
run: |
33+
URL_TO_USE="${URL_TO_USE_DEFAULT//<REPLACE>/${{ inputs.bcss_cloud_environment }}}"
34+
ORACLE_DB="${ORACLE_DB_DEFAULT//<REPLACE>/${{ inputs.bcss_cloud_environment }}}"
35+
pytest -m ${{ inputs.marker_to_use }} --base-url=https://$URL_TO_USE --ignore=tests_utils/
3936
- uses: actions/upload-artifact@v4
4037
if: ${{ !cancelled() }}
4138
with:

.github/workflows/execute-tests.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
name: "Test Runner"
22

3+
# This workflow is triggered manually and allows the user to specify the environment and test marker to run.
4+
# It is functional, however will not work against BCSS test environments until we configure some self-hosted
5+
# GitHub runners, as the GitHub-hosted runners are based outside of the UK so get blocked by the WAF on the
6+
# environments.
7+
38
on:
49
workflow_dispatch:
510
inputs:
@@ -17,12 +22,19 @@ jobs:
1722
run-tests:
1823
name: "Run Specified Tests"
1924
runs-on: ubuntu-latest
20-
timeout-minutes: 3
25+
timeout-minutes: 10
2126
steps:
2227
- name: "Checkout code"
2328
uses: actions/checkout@v4
2429
- name: "Run Tests"
30+
id: run-tests
2531
uses: ./.github/actions/run-playwright-tests
2632
with:
2733
bcss_cloud_environment: "${{ inputs.bcss_cloud_environment }}"
2834
marker_to_use: "${{ inputs.marker_to_use }}"
35+
env:
36+
BCSS_PASS: ${{ secrets.BCSS_PASS }}
37+
ORACLE_DB_DEFAULT: ${{ secrets.ORACLE_DB }}
38+
ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }}
39+
ORACLE_PASS: ${{ secrets.ORACLE_PASS }}
40+
URL_TO_USE_DEFAULT: ${{ vars.CLOUD_ENV_URL }}

pages/screening_practitioner_appointments/appointment_detail_page.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ def __init__(self, page: Page):
88
self.page = page
99
# Appointment Detail - page filters
1010
self.attendance_radio = self.page.get_by_role("radio", name="Attendance")
11-
self.attendented_check_box = self.page.locator("#UI_ATTENDED")
11+
self.attended_check_box = self.page.locator("#UI_ATTENDED")
1212
self.calendar_button = self.page.get_by_role("button", name="Calendar")
1313
self.save_button = self.page.get_by_role("button", name="Save")
1414

1515
def check_attendance_radio(self) -> None:
1616
self.attendance_radio.check()
1717

18-
def check_attendented_check_box(self) -> None:
19-
self.attendented_check_box.check()
18+
def check_attended_check_box(self) -> None:
19+
self.attended_check_box.check()
2020

2121
def click_calendar_button(self) -> None:
2222
self.click(self.calendar_button)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from playwright.sync_api import Page
2+
from pages.base_page import BasePage
3+
4+
5+
class AttendDiagnosticTest(BasePage):
6+
def __init__(self, page: Page):
7+
super().__init__(page)
8+
self.page = page
9+
# Advance Diagnostic Test - page locators
10+
self.actual_type_of_test_dropdown = self.page.locator("#UI_CONFIRMED_TYPE_OF_TEST")
11+
self.calendar_button = self.page.get_by_role("button", name="Calendar")
12+
self.save_button =self.page.get_by_role("button", name="Save")
13+
14+
def select_actual_type_of_test_dropdown_option(self, text: str) -> None:
15+
self.actual_type_of_test_dropdown.select_option(label=text)
16+
17+
def click_calendar_button(self) -> None:
18+
self.click(self.calendar_button)
19+
20+
def click_save_button(self) -> None:
21+
self.click(self.save_button)

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ pandas~=2.2.3
77
python-dotenv~=1.0.1
88
sqlalchemy>=2.0.38
99
jproperties~=2.1.2
10+
pypdf>=5.3.0

tests/smokescreen/test_compartment_1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_compartment_1(page: Page, smokescreen_properties: dict) -> None:
8888
"Skipping S1 Pre-invitation (FIT) (digital leaflet) as no self referral invitations were generated"
8989
)
9090
batch_processing(
91-
page, "S1", "Pre-invitation (FIT)", "S9 - Pre-invitation Sent", True
91+
page, "S1", "Pre-invitation (FIT)", "S9 - Pre-invitation Sent", True, True
9292
)
9393

9494
# Print the batch of Invitation & Test Kit Letters - England

tests/smokescreen/test_compartment_5.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from pages.screening_practitioner_appointments.appointment_calendar_page import (
2929
AppointmentCalendar,
3030
)
31+
from pages.screening_subject_search.attend_diagnostic_test_page import (
32+
AttendDiagnosticTest,
33+
)
3134
from utils.user_tools import UserTools
3235
from utils.load_properties_file import PropertiesFile
3336
from utils.screening_subject_page_searcher import verify_subject_event_status_by_nhs_no
@@ -84,7 +87,7 @@ def test_compartment_5(page: Page, smokescreen_properties: dict) -> None:
8487

8588
# Select Attendance radio button, tick Attended checkbox, set Attended Date to yesterday's (system) date and then press Save
8689
AppointmentDetail(page).check_attendance_radio()
87-
AppointmentDetail(page).check_attendented_check_box()
90+
AppointmentDetail(page).check_attended_check_box()
8891
AppointmentDetail(page).click_calendar_button()
8992
CalendarPicker(page).v1_calender_picker(datetime.today() - timedelta(1))
9093
AppointmentDetail(page).click_save_button()
@@ -148,10 +151,10 @@ def test_compartment_5(page: Page, smokescreen_properties: dict) -> None:
148151
AdvanceFOBTScreeningEpisode(page).click_attend_diagnostic_test_button()
149152

150153
# Select Colonoscopy from drop down list. Enter the actual appointment date as today's date and select 'Save'
151-
page.locator("#UI_CONFIRMED_TYPE_OF_TEST").select_option(label="Colonoscopy")
152-
page.get_by_role("button", name="Calendar").click()
154+
AttendDiagnosticTest.select_actual_type_of_test_dropdown_option("Colonoscopy")
155+
AttendDiagnosticTest.click_calendar_button()
153156
CalendarPicker(page).v1_calender_picker(datetime.today())
154-
page.get_by_role("button", name="Save").click()
157+
AttendDiagnosticTest.click_save_button()
155158
SubjectScreeningSummary(page).verify_latest_event_status_value(
156159
"A259 - Attended Diagnostic Test"
157160
)

utils/batch_processing.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from utils.screening_subject_page_searcher import verify_subject_event_status_by_nhs_no
1111
from utils.oracle.oracle_specific_functions import get_nhs_no_from_batch_id
1212
from utils.oracle.oracle import OracleDB
13+
from utils.pdf_reader import extract_nhs_no_from_pdf
1314
import os
1415
import pytest
1516
from playwright.sync_api import Page
1617
import logging
18+
import pandas as pd
1719

1820

1921
def batch_processing(
@@ -22,6 +24,7 @@ def batch_processing(
2224
batch_description: str,
2325
latest_event_status: str,
2426
run_timed_events: bool = False,
27+
get_subjects_from_pdf: bool = False,
2528
) -> None:
2629
"""
2730
This util is used to process batches. It expects the following inputs:
@@ -30,6 +33,7 @@ def batch_processing(
3033
- batch_description: This is the description of the batch. E.g. Pre-invitation (FIT)
3134
- latest_event_status: This is the status the subject will get updated to after the batch has been processed.
3235
- run_timed_events: This is an optional input that executes bcss_timed_events if set to True
36+
- get_subjects_from_pdf: This is an optial input to change the method of retrieving subjects from the batch from the Db to the PDF file.
3337
"""
3438
logging.info(f"Processing {batch_type} - {batch_description} batch")
3539
BasePage(page).click_main_menu_link()
@@ -39,8 +43,9 @@ def batch_processing(
3943

4044
batch_description_cells = page.locator(f"//td[text()='{batch_description}']")
4145

42-
if batch_description_cells.count() == 0 and page.locator(
43-
"td", has_text="No matching records found"
46+
if (
47+
batch_description_cells.count() == 0
48+
and page.locator("td", has_text="No matching records found").is_visible()
4449
):
4550
pytest.fail(f"No {batch_type} {batch_description} batch found")
4651

@@ -55,41 +60,31 @@ def batch_processing(
5560
logging.info(
5661
f"Successfully found open '{batch_type} - {batch_description}' batch"
5762
)
58-
try:
59-
logging.info(
60-
f"Attempting to get NHS Numbers for batch {link_text} from the DB"
61-
)
62-
nhs_no_df = get_nhs_no_from_batch_id(link_text)
63-
logging.info(
64-
f"Successfully retrieved NHS Numbers from batch {link_text}"
65-
)
66-
except Exception as e:
67-
pytest.fail(
68-
f"Failed to retrieve NHS Numbers from batch {link_text}, {str(e)}"
69-
)
7063
link.click()
7164
break
7265
elif (i + 1) == batch_description_cells.count():
7366
pytest.fail(f"No open '{batch_type} - {batch_description}' batch found")
7467

75-
prepare_and_print_batch(page, link_text)
68+
if get_subjects_from_pdf:
69+
logging.info(f"Getting NHS Numbers for batch {link_text} from the PDF File")
70+
nhs_no_df = prepare_and_print_batch(page, link_text, get_subjects_from_pdf)
71+
else:
72+
logging.info(f"Getting NHS Numbers for batch {link_text} from the DB")
73+
prepare_and_print_batch(page, link_text, get_subjects_from_pdf)
74+
nhs_no_df = get_nhs_no_from_batch_id(link_text)
7675

7776
check_batch_in_archived_batch_list(page, link_text)
7877

7978
first_nhs_no = nhs_no_df["subject_nhs_number"].iloc[0]
80-
try:
81-
verify_subject_event_status_by_nhs_no(page, first_nhs_no, latest_event_status)
82-
logging.info(
83-
f"Successfully verified NHS number {first_nhs_no} with status {latest_event_status}"
84-
)
85-
except Exception as e:
86-
pytest.fail(f"Verification failed for NHS number {first_nhs_no}: {str(e)}")
79+
verify_subject_event_status_by_nhs_no(page, first_nhs_no, latest_event_status)
8780

8881
if run_timed_events:
8982
OracleDB().exec_bcss_timed_events(nhs_no_df)
9083

9184

92-
def prepare_and_print_batch(page: Page, link_text) -> None:
85+
def prepare_and_print_batch(
86+
page: Page, link_text: str, get_subjects_from_pdf: bool = False
87+
) -> pd.DataFrame | None:
9388
"""
9489
This method prepares the batch, retreives the files and confirms them as printed
9590
Once those buttons have been pressed it waits for the message 'Batch Successfully Archived'
@@ -114,6 +109,11 @@ def prepare_and_print_batch(page: Page, link_text) -> None:
114109
file = download_file.suggested_filename
115110
# Wait for the download process to complete and save the downloaded file in a temp folder
116111
download_file.save_as(file)
112+
nhs_no_df = (
113+
extract_nhs_no_from_pdf(file)
114+
if file.endswith(".pdf") and get_subjects_from_pdf
115+
else None
116+
)
117117
os.remove(file) # Deletes the file after extracting the necessary data
118118
except Exception as e:
119119
pytest.fail(f"No retrieve button available to click: {str(e)}")
@@ -137,6 +137,8 @@ def prepare_and_print_batch(page: Page, link_text) -> None:
137137
except Exception as e:
138138
pytest.fail(f"Batch successfully archived message is not shown: {str(e)}")
139139

140+
return nhs_no_df
141+
140142

141143
def check_batch_in_archived_batch_list(page: Page, link_text) -> None:
142144
"""

utils/pdf_reader.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from pypdf import PdfReader
2+
import pandas as pd
3+
4+
5+
def extract_nhs_no_from_pdf(file: str) -> pd.DataFrame:
6+
reader = PdfReader(file)
7+
nhs_no_df = pd.DataFrame(columns=["subject_nhs_number"])
8+
# For loop looping through all pages of the file to find the NHS Number
9+
for i, pages in enumerate(reader.pages):
10+
text = pages.extract_text()
11+
if "NHS No" in text:
12+
# If NHS number is found split the text by every new line into a list
13+
text = text.splitlines(True)
14+
for split_text in text:
15+
if "NHS No" in split_text:
16+
# If a string is found containing "NHS No" only digits are stored into nhs_no
17+
nhs_no = "".join([ele for ele in split_text if ele.isdigit()])
18+
nhs_no_df.loc[i] = [nhs_no]
19+
return nhs_no_df

0 commit comments

Comments
 (0)