Skip to content

Commit e39db27

Browse files
AC - got ruff and mypy tests all passing
1 parent d2cba20 commit e39db27

14 files changed

+110
-91
lines changed

pages/bcss_home_page.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,35 @@ def __init__(self, page: Page):
2828
)
2929
self.contacts_list = self.page.get_by_role("link", name="Contacts List")
3030

31-
def click_sub_menu_link(self):
31+
def click_sub_menu_link(self) -> None:
3232
self.sub_menu_link.click()
3333

34-
def click_hide_sub_menu_link(self):
34+
def click_hide_sub_menu_link(self) -> None:
3535
self.hide_sub_menu_link.click()
3636

37-
def click_select_org_link(self):
37+
def click_select_org_link(self) -> None:
3838
self.select_org_link.click()
3939

40-
def click_back_button(self):
40+
def click_back_button(self) -> None:
4141
self.back_button.click()
4242

43-
def click_release_notes_link(self):
43+
def click_release_notes_link(self) -> None:
4444
self.release_notes_link.click()
4545

46-
def click_refresh_alerts_link(self):
46+
def click_refresh_alerts_link(self) -> None:
4747
self.refresh_alerts_link.click()
4848

49-
def click_user_guide_link(self):
49+
def click_user_guide_link(self) -> None:
5050
self.user_guide_link.click()
5151

52-
def click_help_link(self):
52+
def click_help_link(self) -> None:
5353
self.help_link.click()
5454

55-
def click_screening_pracitioners_appointments(self):
55+
def click_screening_pracitioners_appointments(self) -> None:
5656
self.screening_pracitioners_appointments.click()
5757

58-
def click_contacts_list(self):
58+
def click_contacts_list(self) -> None:
5959
self.contacts_list.click()
6060

61-
def click_logout(self):
61+
def click_logout(self) -> None:
6262
self.log_out.click()

pages/contacts_list.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,28 @@ def __init__(self, page: Page):
88

99
# Main Menu
1010
self.view_contacts = self.page.get_by_role("link", name="View Contacts")
11-
self.edit_my_contact_details = self.page.get_by_role(
12-
"link", name="Edit My Contact Details"
13-
)
11+
self.edit_my_contact_details = self.page.get_by_role("link", name="Edit My Contact Details")
1412
self.maintain_contacts = self.page.get_by_role("link", name="Maintain Contacts")
15-
self.my_preference_settings = self.page.get_by_role(
16-
"link", name="My Preference Settings"
17-
)
18-
self.extract_contact_details = self.page.get_by_role(
19-
"link", name="Extract Contact Details"
20-
)
13+
self.my_preference_settings = self.page.get_by_role("link", name="My Preference Settings")
14+
self.extract_contact_details = self.page.get_by_role("link", name="Extract Contact Details")
2115
self.resect_and_discard_accredited_endoscopists = self.page.get_by_role(
2216
"link", name="Resect and Discard Accredited Endoscopists"
2317
)
2418

25-
def click_view_contacts(self):
19+
def click_view_contacts(self) -> None:
2620
self.view_contacts.click()
2721

28-
def click_edit_my_contact_details(self):
22+
def click_edit_my_contact_details(self) -> None:
2923
self.edit_my_contact_details.click()
3024

31-
def click_maintain_contacts(self):
25+
def click_maintain_contacts(self) -> None:
3226
self.maintain_contacts.click()
3327

34-
def click_my_preference_settings(self):
28+
def click_my_preference_settings(self) -> None:
3529
self.my_preference_settings.click()
3630

37-
def click_extract_contact_details(self):
31+
def click_extract_contact_details(self) -> None:
3832
self.extract_contact_details.click()
3933

40-
def click_resect_and_discard_accredited_endoscopists(self):
34+
def click_resect_and_discard_accredited_endoscopists(self) -> None:
4135
self.resect_and_discard_accredited_endoscopists.click()

pages/login.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import logging
12
from playwright.sync_api import Page
23

4+
logger = logging.getLogger(__name__)
5+
36

47
class BcssLoginPage:
58

@@ -10,7 +13,10 @@ def __init__(self, page: Page):
1013
self.password = page.get_by_role("textbox", name="Password")
1114
self.submit_button = page.get_by_role("button", name="submit")
1215

13-
def login(self, username, password):
16+
def login(self, username: str | None, password: str | None) -> None:
17+
if username is None or password is None:
18+
logging.error("BCSS_USERNAME and BCSS_PASSWORD environmental variables must be set")
19+
raise ValueError("BCSS_USERNAME and BCSS_PASSWORD environmental variables must be set")
1420
self.username.fill(username)
1521
self.password.fill(password)
1622
self.submit_button.click()

pages/screening_practitioner_appointments.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ def __init__(self, page: Page):
2323

2424
# Main Menu
2525
self.view_appointments = self.page.get_by_role("link", name="View appointments")
26-
self.patients_that_require_colonoscopy_assessment_appointments = (
27-
self.page.get_by_role(
28-
"link", name="Patients that Require Colonoscopy Assessment Appointments"
29-
)
26+
self.patients_that_require_colonoscopy_assessment_appointments = self.page.get_by_role(
27+
"link", name="Patients that Require Colonoscopy Assessment Appointments"
3028
)
3129
self.patients_that_require_colonoscopy_assessment_appointments_bowl_scope = self.page.get_by_role(
3230
"link",
@@ -35,55 +33,53 @@ def __init__(self, page: Page):
3533
self.patients_that_require_surveillance_appointments = self.page.get_by_role(
3634
"link", name="Patients that Require Surveillance Appointments"
3735
)
38-
self.patients_that_require_post_investigation_appointments = (
39-
self.page.get_by_role(
40-
"link", name="Patients that Require Post-Investigation Appointments"
41-
)
36+
self.patients_that_require_post_investigation_appointments = self.page.get_by_role(
37+
"link", name="Patients that Require Post-Investigation Appointments"
4238
)
4339
self.set_availability = self.page.get_by_role("link", name="Set Availability")
4440

4541
# Top menu interactions
46-
def click_sub_menu_link(self):
42+
def click_sub_menu_link(self) -> None:
4743
self.sub_menu_link.click()
4844

49-
def click_hide_sub_menu_link(self):
45+
def click_hide_sub_menu_link(self) -> None:
5046
self.hide_sub_menu_link.click()
5147

52-
def click_select_org_link(self):
48+
def click_select_org_link(self) -> None:
5349
self.select_org_link.click()
5450

55-
def click_back_button(self):
51+
def click_back_button(self) -> None:
5652
self.back_button.click()
5753

58-
def click_release_notes_link(self):
54+
def click_release_notes_link(self) -> None:
5955
self.release_notes_link.click()
6056

61-
def click_refresh_alerts_link(self):
57+
def click_refresh_alerts_link(self) -> None:
6258
self.refresh_alerts_link.click()
6359

64-
def click_user_guide_link(self):
60+
def click_user_guide_link(self) -> None:
6561
self.user_guide_link.click()
6662

67-
def click_help_link(self):
63+
def click_help_link(self) -> None:
6864
self.help_link.click()
6965

7066
# Main Menu interactions
71-
def click_view_appointments(self):
67+
def click_view_appointments(self) -> None:
7268
self.view_appointments.click()
7369

74-
def click_patients_that_require_colonoscopy_assessment_appointments(self):
70+
def click_patients_that_require_colonoscopy_assessment_appointments(self) -> None:
7571
self.patients_that_require_colonoscopy_assessment_appointments.click()
7672

7773
def click_patients_that_require_colonoscopy_assessment_appointments_bowl_scope(
7874
self,
79-
):
75+
) -> None:
8076
self.patients_that_require_colonoscopy_assessment_appointments_bowl_scope.click()
8177

82-
def click_patients_that_require_surveillance_appointments(self):
78+
def click_patients_that_require_surveillance_appointments(self) -> None:
8379
self.patients_that_require_surveillance_appointments.click()
8480

85-
def click_patients_that_require_post_investigation_appointments(self):
81+
def click_patients_that_require_post_investigation_appointments(self) -> None:
8682
self.patients_that_require_post_investigation_appointments.click()
8783

88-
def click_set_availability(self):
84+
def click_set_availability(self) -> None:
8985
self.set_availability.click()

pyproject.toml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[tool.black]
2+
line-length = 120
3+
4+
[tool.ruff]
5+
line-length = 120
6+
7+
target-version = "py312"
8+
9+
lint.select = [
10+
"E", # pycodestyle
11+
"W", # pycodestyle
12+
"F", # pyflakes
13+
"I", # isort
14+
"B", # flake8-bugbear
15+
"C90", # mccabe cyclomatic complexity
16+
"G", # flake8-logging-format
17+
]
18+
lint.ignore = []
19+
exclude = [
20+
"docs/adr/assets"
21+
]

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ python-dotenv>=1.0.1
66
pytest-retry>=1.6.3
77
pytest-xdist>=3.6.1
88
mypy>=1.14.1
9-
PyMuPDF>=1.24.13
9+
ruff>=0.9.6

run_tests.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/bash
22

3+
ruff --fix
34
mypy tests/*.py pages/*.py utils/*.py --disallow-untyped-defs --explicit-package-bases
45
pytest

tests/test_contacts_list.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,46 @@
1-
from gc import get_count
2-
from os import environ
1+
import logging
32
import random
43
import re
4+
from os import environ
5+
56
import pytest
6-
import logging
7+
from dotenv import load_dotenv
78
from playwright.sync_api import Page, expect
8-
from pages.login import BcssLoginPage
9+
910
from pages.bcss_home_page import BcssHomePage
1011
from pages.contacts_list import ContactsList
11-
from dotenv import load_dotenv
12+
from pages.login import BcssLoginPage
1213

1314
load_dotenv()
1415
logger = logging.getLogger(__name__)
1516
expect.set_options(timeout=20_000)
1617

1718

1819
@pytest.fixture(scope="function", autouse=True)
19-
def before_each(page: Page):
20+
def before_each(page: Page) -> None:
2021
username = environ.get("BCSS_USERNAME")
2122
password = environ.get("BCSS_PASSWORD")
2223
login_page = BcssLoginPage(page)
2324
login_page.login(username, password)
2425

2526

26-
def get_to_screen(page: Page):
27+
def get_to_screen(page: Page) -> None:
2728
homepage = BcssHomePage(page)
28-
expect(
29-
page.get_by_role("link", name="Screening Practitioner Appointments")
30-
).to_be_visible()
29+
expect(page.get_by_role("link", name="Screening Practitioner Appointments")).to_be_visible()
3130
homepage.click_contacts_list()
3231
page.screenshot(path="test-results/contacts_list/select_org_screen.png")
3332
expect(page.get_by_text("Contacts List")).to_be_visible()
3433

3534

36-
def test_view_contacts(page: Page):
35+
def test_view_contacts(page: Page) -> None:
3736
get_to_screen(page)
3837
contacts_list = ContactsList(page)
3938
contacts_list.click_view_contacts()
4039
page.screenshot(path="test-results/contacts_list/contacts_list.png")
4140
expect(page.get_by_text("View Contacts")).to_be_visible()
4241

4342

44-
def test_edit_my_contact_details(page: Page):
43+
def test_edit_my_contact_details(page: Page) -> None:
4544
get_to_screen(page)
4645
contacts_list = ContactsList(page)
4746
contacts_list.click_edit_my_contact_details()
@@ -55,7 +54,7 @@ def test_edit_my_contact_details(page: Page):
5554
expect(page.get_by_text("The action was performed successfully")).to_be_visible()
5655

5756

58-
def generate_phone_number():
57+
def generate_phone_number() -> str:
5958
# Generate 2 digits for first part
6059
first_part = "".join(str(random.randint(0, 9)) for _ in range(2))
6160
# Generate 2 digits for second part

tests/test_example.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@pytest.mark.example
1515
def test_basic_example(page: Page) -> None:
16-
'''
16+
"""
1717
This test demonstrates how to quickly get started using Playwright Python.
1818
1919
This example starts with @pytest.mark.example, which indicates this test has been tagged
@@ -27,7 +27,7 @@ def test_basic_example(page: Page) -> None:
2727
1) Navigates to this repository
2828
2) Asserts that the README contents rendered by GitHub contains the text "Playwright Python Blueprint"
2929
3) Asserts that the main section of the page contains the topic label "playwright-python"
30-
'''
30+
"""
3131

3232
# Navigate to page
3333
page.goto("https://github.com/nhs-england-tools/playwright-python-blueprint")

tests/test_homepage_links.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from os import environ
2+
23
import pytest
4+
from dotenv import load_dotenv
35
from playwright.sync_api import Page, expect
4-
from pages.login import BcssLoginPage
6+
57
from pages.bcss_home_page import BcssHomePage
6-
from dotenv import load_dotenv
8+
from pages.login import BcssLoginPage
79

810
load_dotenv()
911
expect.set_options(timeout=30_000)
1012

1113

1214
@pytest.fixture(scope="function", autouse=True)
13-
def before_each(page: Page):
15+
def before_each(page: Page) -> None:
1416
# This will run before every other job and log in to the homepage.
1517
username = environ.get("BCSS_USERNAME")
1618
password = environ.get("BCSS_PASSWORD")
@@ -36,9 +38,7 @@ def test_homepage_select_org(page: Page) -> None:
3638
# check the select org link works
3739
homepage.click_select_org_link()
3840
page.screenshot(path="test-results/homepage/select_org_screen.png")
39-
expect(page.locator("form[action*='/changeorg']")).to_contain_text(
40-
"Choose an Organisation"
41-
)
41+
expect(page.locator("form[action*='/changeorg']")).to_contain_text("Choose an Organisation")
4242
# Check there is at least one entry in the organisation list
4343
table_locator = page.locator("table#organisations tr")
4444
row_count = table_locator.count()
@@ -65,9 +65,8 @@ def test_homepage_help(page: Page) -> None:
6565
homepage.click_help_link()
6666
help_page = popup_info.value
6767
help_page.screenshot(path="test-results/homepage/help_screen.png")
68-
expect(
69-
help_page.get_by_text("Bowel Cancer Screening System Help")
70-
).to_be_visible
68+
help_page_element = help_page.get_by_text("Bowel Cancer Screening System Help")
69+
expect(help_page_element).to_be_visible()
7170

7271

7372
def test_homepage_user_guide(page: Page) -> None:

0 commit comments

Comments
 (0)