Skip to content

Commit 0618598

Browse files
committed
add and use page object for session wizard
1 parent 3602a2e commit 0618598

19 files changed

+309
-212
lines changed

mavis/test/fixtures/helpers.py

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@
1919
ProgrammesListPage,
2020
SchoolsChildrenPage,
2121
SchoolsSearchPage,
22-
SessionsEditPage,
2322
SessionsOverviewPage,
24-
SessionsSearchPage,
2523
VaccinesPage,
2624
)
25+
from mavis.test.pages.utils import schedule_school_session_if_needed
2726
from mavis.test.utils import get_offset_date
2827

2928

@@ -57,23 +56,16 @@ def wrapper(vaccine: Vaccine, batch_name: str = "ABC123"):
5756

5857
@pytest.fixture
5958
def schedule_session_and_get_consent_url(
60-
set_feature_flags,
61-
nurse,
62-
team,
63-
page,
59+
set_feature_flags, nurse, team, page, year_groups
6460
):
6561
def wrapper(school: School, *programmes: Programme):
62+
year_group = year_groups[programmes[0].group]
63+
6664
LogInPage(page).navigate()
6765
LogInPage(page).log_in_and_choose_team_if_necessary(nurse, team)
68-
DashboardPage(page).click_sessions()
69-
SessionsSearchPage(page).click_session_for_programme_group(
70-
school, programmes[0].group
66+
schedule_school_session_if_needed(
67+
page, school, list(programmes), [year_group], date_offset=7
7168
)
72-
if not SessionsOverviewPage(page).is_date_scheduled(get_offset_date(7)):
73-
SessionsOverviewPage(page).schedule_or_edit_session()
74-
SessionsEditPage(page).schedule_a_valid_session(
75-
offset_days=7, skip_weekends=False
76-
)
7769
url = SessionsOverviewPage(page).get_online_consent_url(*programmes)
7870
LogInPage(page).log_out()
7971
yield url
@@ -83,21 +75,17 @@ def wrapper(school: School, *programmes: Programme):
8375

8476
@pytest.fixture
8577
def schedule_mmr_session_and_get_consent_url(
86-
set_feature_flags,
87-
nurse,
88-
team,
89-
page,
78+
set_feature_flags, nurse, team, page, year_groups
9079
):
9180
def wrapper(school: School, *programmes: Programme):
9281
try:
82+
year_group = year_groups[programmes[0].group]
83+
9384
LogInPage(page).navigate()
9485
LogInPage(page).log_in_and_choose_team_if_necessary(nurse, team)
95-
DashboardPage(page).click_sessions()
96-
SessionsSearchPage(page).click_session_for_programme_group(
97-
school, programmes[0].group
86+
schedule_school_session_if_needed(
87+
page, school, list(programmes), [year_group], date_offset=7
9888
)
99-
SessionsOverviewPage(page).schedule_or_edit_session()
100-
SessionsEditPage(page).schedule_a_valid_mmr_session()
10189
url = SessionsOverviewPage(page).get_online_consent_url(*programmes)
10290
LogInPage(page).log_out()
10391
yield url
@@ -173,14 +161,7 @@ def wrapper(
173161
child.year_group,
174162
programme.group,
175163
)
176-
ImportsPage(page).header.click_mavis_header()
177-
DashboardPage(page).click_sessions()
178-
SessionsSearchPage(page).click_session_for_programme_group(school, programme)
179-
if not SessionsOverviewPage(page).is_date_scheduled(get_offset_date(0)):
180-
SessionsOverviewPage(page).schedule_or_edit_session()
181-
SessionsEditPage(page).schedule_a_valid_session(
182-
offset_days=0, skip_weekends=False
183-
)
164+
schedule_school_session_if_needed(page, school, [programme], [child.year_group])
184165
session_id = SessionsOverviewPage(page).get_session_id_from_offline_excel()
185166
SessionsOverviewPage(page).header.click_mavis_header()
186167
DashboardPage(page).click_imports()
@@ -228,14 +209,14 @@ def _setup(programme_group):
228209
}
229210
VaccinesPage(page).header.click_mavis_header()
230211
DashboardPage(page).click_sessions()
231-
SessionsSearchPage(page).click_session_for_programme_group(
232-
school, programme_group
212+
session_programmes = [
213+
programme
214+
for programme in Programme
215+
if programme.group == programme_group
216+
]
217+
schedule_school_session_if_needed(
218+
page, school, session_programmes, [child.year_group]
233219
)
234-
if not SessionsOverviewPage(page).is_date_scheduled(get_offset_date(0)):
235-
SessionsOverviewPage(page).schedule_or_edit_session()
236-
SessionsEditPage(page).schedule_a_valid_session(
237-
offset_days=0, skip_weekends=False
238-
)
239220
SessionsOverviewPage(page).header.click_mavis_header()
240221
DashboardPage(page).click_schools()
241222
SchoolsSearchPage(page).click_school(school)

mavis/test/pages/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from .add_session_wizard_page import AddSessionWizardPage
12
from .children import (
23
ChildActivityLogPage,
34
ChildArchivePage,
@@ -48,6 +49,7 @@
4849

4950
__all__ = [
5051
"AddBatchPage",
52+
"AddSessionWizardPage",
5153
"ArchiveBatchPage",
5254
"ArchiveConsentResponsePage",
5355
"BadRequestPage",
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
from playwright.sync_api import Page
2+
3+
from mavis.test.annotations import step
4+
from mavis.test.constants import Programme
5+
from mavis.test.data_models import School
6+
from mavis.test.pages.header_component import HeaderComponent
7+
from mavis.test.utils import (
8+
get_day_month_year_from_compact_date,
9+
get_offset_date_compact_format,
10+
)
11+
12+
13+
class AddSessionWizardPage:
14+
def __init__(
15+
self,
16+
page: Page,
17+
) -> None:
18+
self.page = page
19+
self.header = HeaderComponent(page)
20+
21+
self.continue_button = self.page.get_by_role("button", name="Continue")
22+
self.day_textbox = self.page.get_by_role("textbox", name="Day")
23+
self.month_textbox = self.page.get_by_role("textbox", name="Month")
24+
self.year_textbox = self.page.get_by_role("textbox", name="Year")
25+
self.add_another_date_button = self.page.get_by_role(
26+
"button",
27+
name="Add another date",
28+
)
29+
self.school_session_radio = self.page.get_by_role(
30+
"radio",
31+
name="School session",
32+
)
33+
self.community_clinic_radio = self.page.get_by_role(
34+
"radio",
35+
name="Community clinic",
36+
)
37+
self.select_a_school_combobox = self.page.get_by_role(
38+
"combobox",
39+
name="Select a school",
40+
)
41+
self.keep_session_dates_button = self.page.get_by_role(
42+
"button", name="Keep session dates"
43+
)
44+
45+
@step("Select School session")
46+
def select_school_session(self) -> None:
47+
self.school_session_radio.check()
48+
self.click_continue()
49+
50+
@step("Select Community clinic")
51+
def select_community_clinic(self) -> None:
52+
self.community_clinic_radio.check()
53+
self.click_continue()
54+
55+
def select_school(self, school: School) -> None:
56+
self.fill_school_name(school)
57+
self.click_continue()
58+
59+
@step("Fill school name")
60+
def fill_school_name(self, school: School) -> None:
61+
self.page.reload() # to allow combobox to be interactable
62+
self.select_a_school_combobox.fill(str(school))
63+
self.page.get_by_role("option", name=str(school)).click()
64+
65+
@step("Click Continue")
66+
def click_continue(self) -> None:
67+
self.continue_button.click()
68+
69+
@step("Select year groups {1}")
70+
def select_year_groups(self, year_groups: list[int]) -> None:
71+
for year_group in year_groups:
72+
self.page.locator(f'input[type="checkbox"][value="{year_group}"]').check()
73+
74+
self.click_continue()
75+
76+
@step("Choose programmes {1}")
77+
def choose_programmes(self, programmes: list[Programme]) -> None:
78+
for programme in programmes:
79+
self.page.get_by_role("checkbox", name=programme).check()
80+
self.click_continue()
81+
82+
@step("Click on Add another date")
83+
def click_add_another_date(self) -> None:
84+
self.add_another_date_button.click()
85+
86+
@step("Fill date fields with {1}")
87+
def fill_date_fields(self, date: str) -> None:
88+
day, month, year = get_day_month_year_from_compact_date(date)
89+
90+
self.day_textbox.last.fill(str(day))
91+
self.month_textbox.last.fill(str(month))
92+
self.year_textbox.last.fill(str(year))
93+
94+
self.click_continue()
95+
96+
@step("Click Keep session dates")
97+
def click_keep_session_dates(self) -> None:
98+
self.keep_session_dates_button.click()
99+
100+
def schedule_school_session(
101+
self,
102+
school: School,
103+
programmes: list[Programme],
104+
year_groups: list[int],
105+
date_offset: int,
106+
) -> None:
107+
self.select_school_session()
108+
self.select_school(school)
109+
self.choose_programmes(programmes)
110+
self.select_year_groups(year_groups)
111+
self.fill_date_fields(get_offset_date_compact_format(date_offset))
112+
113+
self.keep_session_dates_if_necessary()
114+
115+
self.click_continue()
116+
117+
def schedule_clinic_session(
118+
self,
119+
programmes: list[Programme],
120+
date_offset: int,
121+
) -> None:
122+
self.select_community_clinic()
123+
self.choose_programmes(programmes)
124+
self.fill_date_fields(get_offset_date_compact_format(date_offset))
125+
126+
self.click_continue()
127+
128+
@step("Keep session dates if necessary")
129+
def keep_session_dates_if_necessary(self) -> None:
130+
if self.keep_session_dates_button.is_visible():
131+
self.click_keep_session_dates()

mavis/test/pages/imports/import_records_wizard_page.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ def __init__(
4343
self.continue_button = self.page.get_by_role("button", name="Continue")
4444
self.file_input = self.page.locator('input[type="file"]')
4545
self.location_combobox = self.page.get_by_role("combobox")
46-
self.imported_records_tab = self.page.get_by_role(
46+
self.completed_imports_tab = self.page.get_by_role(
4747
"link",
48-
name="Imported records",
48+
name="Completed imports",
4949
)
5050

5151
# Pattern to match dynamic text (s is optional for records)
@@ -217,7 +217,7 @@ def click_uploaded_file_datetime(self, date_time: datetime) -> None:
217217
if first_link.or_(second_link).first.is_visible():
218218
first_link.or_(second_link).first.click()
219219
else:
220-
self.imported_records_tab.click()
220+
self.completed_imports_tab.click()
221221
first_link.or_(second_link).first.click()
222222

223223
@step("Verify upload output for {file_path}")

mavis/test/pages/schools/schools_sessions_page.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from playwright.sync_api import Page
22

3+
from mavis.test.annotations import step
34
from mavis.test.pages.header_component import HeaderComponent
45
from mavis.test.pages.schools.schools_tabs import SchoolsTabs
56

@@ -9,3 +10,8 @@ def __init__(self, page: Page) -> None:
910
self.page = page
1011
self.header = HeaderComponent(page)
1112
self.tabs = SchoolsTabs(page)
13+
self.add_a_new_session_link = page.get_by_role("link", name="Add a new session")
14+
15+
@step("Click Add a new session")
16+
def click_add_a_new_session(self) -> None:
17+
self.add_a_new_session_link.click()

mavis/test/pages/sessions/sessions_edit_page.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,7 @@ def answer_whether_psd_should_be_enabled(self, answer: str) -> None:
245245
" using a patient specific direction (PSD)?"
246246
),
247247
).get_by_label(answer).check()
248+
249+
def continue_if_warning_appears(self) -> None:
250+
if self.page.get_by_role("button", name="Continue").is_visible():
251+
self.click_continue_button()

mavis/test/pages/sessions/sessions_search_page.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@
77
from mavis.test.data_models import Location
88
from mavis.test.pages.header_component import HeaderComponent
99
from mavis.test.pages.search_components import BaseSearchComponent
10+
from mavis.test.utils import get_formatted_date_without_year, get_offset_date
1011

1112

1213
class SessionsSearchPage:
1314
def __init__(self, page: Page) -> None:
1415
self.page = page
1516
self.search = BaseSearchComponent(page)
1617
self.header = HeaderComponent(page)
18+
self.add_a_new_session_link = page.get_by_role("link", name="Add a new session")
19+
20+
@step("Click Add a new session")
21+
def click_add_a_new_session(self) -> None:
22+
self.add_a_new_session_link.click()
1723

1824
@step("Click on {2} session at {1}")
1925
def click_session_for_programme_group(
@@ -35,3 +41,29 @@ def click_session_for_programme_group(
3541
expect(self.page.locator("h1", has_text=str(location))).to_be_visible(
3642
timeout=ten_seconds_ms,
3743
)
44+
45+
@step("Check if session exists")
46+
def click_session_if_exists(
47+
self,
48+
location: Location,
49+
programmes: list[Programme],
50+
year_groups: list[int],
51+
date_offset: int,
52+
) -> bool:
53+
self.search.search_for(str(location))
54+
self.page.wait_for_load_state()
55+
session_locators = self.page.locator(
56+
"div.nhsuk-card--clickable.app-card.app-card--compact"
57+
)
58+
session_date = get_formatted_date_without_year(get_offset_date(date_offset))
59+
60+
for i in range(session_locators.count()):
61+
card_text = session_locators.nth(i).inner_text()
62+
if (
63+
all(str(programme) in card_text for programme in programmes)
64+
and session_date in card_text
65+
and all(str(year_group) in card_text for year_group in year_groups)
66+
):
67+
session_locators.nth(i).get_by_role("link").click()
68+
return True
69+
return False

mavis/test/pages/utils.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from playwright.sync_api import Page
2+
3+
from mavis.test.constants import Programme
4+
from mavis.test.data_models import Clinic, School
5+
from mavis.test.pages import AddSessionWizardPage, DashboardPage, SessionsSearchPage
6+
7+
8+
def schedule_school_session_if_needed(
9+
page: Page,
10+
school: School,
11+
programmes: list[Programme],
12+
year_groups: list[int],
13+
date_offset: int = 0,
14+
) -> None:
15+
DashboardPage(page).header.click_mavis_header()
16+
DashboardPage(page).click_sessions()
17+
if not SessionsSearchPage(page).click_session_if_exists(
18+
school, programmes, year_groups, date_offset
19+
):
20+
SessionsSearchPage(page).click_add_a_new_session()
21+
AddSessionWizardPage(page).schedule_school_session(
22+
school, programmes, year_groups, date_offset
23+
)
24+
25+
26+
def schedule_community_clinic_session_if_needed(
27+
page: Page,
28+
programmes: list[Programme],
29+
date_offset: int = 0,
30+
) -> None:
31+
DashboardPage(page).header.click_mavis_header()
32+
DashboardPage(page).click_sessions()
33+
if not SessionsSearchPage(page).click_session_if_exists(
34+
Clinic("community clinic"), programmes, [], date_offset
35+
):
36+
SessionsSearchPage(page).click_add_a_new_session()
37+
AddSessionWizardPage(page).schedule_clinic_session(programmes, date_offset)

0 commit comments

Comments
 (0)