Skip to content

Commit d7e54c9

Browse files
committed
CCM-7079: NHS App Review page page automation
1 parent 2be0de8 commit d7e54c9

File tree

4 files changed

+247
-0
lines changed

4 files changed

+247
-0
lines changed

tests/test-team/helpers/session-factory.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ export const SessionFactory = {
1515
});
1616
},
1717

18+
createNhsAppSession: (id: string): Session => {
19+
return SessionFactory.create({
20+
id,
21+
templateType: TemplateType.NHS_APP,
22+
});
23+
},
24+
1825
create: ({
1926
id,
2027
templateType,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Locator, Page } from '@playwright/test';
2+
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
3+
4+
export class TemplateMgmtPreviewNhsAppPage extends TemplateMgmtBasePage {
5+
public readonly editRadioOption: Locator;
6+
7+
public readonly submitRadioOption: Locator;
8+
9+
public readonly errorSummary: Locator;
10+
11+
public readonly messageText: Locator;
12+
13+
public readonly whoYourNhsAppNotificationWillBeSentFrom: Locator;
14+
15+
constructor(page: Page) {
16+
super(page);
17+
this.editRadioOption = page.locator(
18+
'[id="reviewNHSAppTemplateAction-nhsapp-edit"]'
19+
);
20+
this.submitRadioOption = page.locator(
21+
'[id="reviewNHSAppTemplateAction-nhsapp-submit"]'
22+
);
23+
this.errorSummary = page.locator('[class="nhsuk-error-summary"]');
24+
this.messageText = page.locator('[id="preview-content-message"]');
25+
this.whoYourNhsAppNotificationWillBeSentFrom = page.locator(
26+
'[data-testid="preview-message-details"]'
27+
);
28+
}
29+
30+
async loadPage(sessionId: string) {
31+
await this.navigateTo(`/templates/preview-nhs-app-template/${sessionId}`);
32+
}
33+
}
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import { test, expect } from '@playwright/test';
2+
import SessionStorageHelper from '../../helpers/session-storage-helper';
3+
import { TemplateMgmtPreviewNhsAppPage } from '../../pages/nhs-app/template-mgmt-preview-nhs-app-page';
4+
import { SessionFactory } from '../../helpers/session-factory';
5+
import {
6+
assertFooterLinks,
7+
assertGoBackLink,
8+
assertLoginLink,
9+
assertNotifyBannerLink,
10+
assertSkipToMainContent,
11+
} from '../template-mgmt-common.steps';
12+
13+
const sessions = {
14+
empty: SessionFactory.createNhsAppSession('empty-nhs-app-preview-session'),
15+
valid: {
16+
...SessionFactory.createNhsAppSession('valid-nhs-app-preview-session'),
17+
nhsAppTemplateName: 'test-template-nhs-app',
18+
nhsAppTemplateMessage: 'test-template-message',
19+
},
20+
};
21+
22+
test.describe('Preview NHS App template Page', () => {
23+
const sessionStorageHelper = new SessionStorageHelper(
24+
Object.values(sessions)
25+
);
26+
27+
test.beforeAll(async () => {
28+
await sessionStorageHelper.seedSessionData();
29+
});
30+
31+
test.afterAll(async () => {
32+
await sessionStorageHelper.deleteSessionData();
33+
});
34+
35+
test('when user visits page, then page is loaded', async ({
36+
page,
37+
baseURL,
38+
}) => {
39+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
40+
41+
await previewNhsAppTemplatePage.loadPage(sessions.valid.id);
42+
43+
await expect(page).toHaveURL(
44+
`${baseURL}/templates/preview-nhs-app-template/${sessions.valid.id}`
45+
);
46+
47+
await expect(previewNhsAppTemplatePage.editRadioOption).not.toBeChecked();
48+
49+
await expect(previewNhsAppTemplatePage.submitRadioOption).not.toBeChecked();
50+
51+
await expect(previewNhsAppTemplatePage.pageHeader).toContainText(
52+
'NHS App message template'
53+
);
54+
55+
await expect(previewNhsAppTemplatePage.pageHeader).toContainText(
56+
'test-template-nhs-app'
57+
);
58+
59+
await expect(previewNhsAppTemplatePage.messageText).toHaveText(
60+
'test-template-message'
61+
);
62+
});
63+
64+
test.describe('Page functionality', () => {
65+
test('common page tests', async ({ page, baseURL }) => {
66+
const props = {
67+
page: new TemplateMgmtPreviewNhsAppPage(page),
68+
id: sessions.valid.id,
69+
baseURL,
70+
};
71+
72+
await assertSkipToMainContent(props);
73+
await assertNotifyBannerLink(props);
74+
await assertLoginLink(props);
75+
await assertFooterLinks(props);
76+
await assertGoBackLink({
77+
...props,
78+
expectedUrl: `templates/create-nhs-app-template/${sessions.valid.id}`,
79+
});
80+
});
81+
82+
test('when user clicks "Who your NHS App notification will be sent from" tool tips, then tool tips are displayed', async ({
83+
page,
84+
}) => {
85+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
86+
87+
await previewNhsAppTemplatePage.loadPage(sessions.valid.id);
88+
89+
await previewNhsAppTemplatePage.whoYourNhsAppNotificationWillBeSentFrom.click(
90+
{
91+
position: { x: 0, y: 0 },
92+
}
93+
);
94+
95+
await expect(
96+
previewNhsAppTemplatePage.whoYourNhsAppNotificationWillBeSentFrom
97+
).toHaveAttribute('open');
98+
});
99+
100+
test('when user submits form with "Edit" data, then the "Create NHS App message template" page is displayed', async ({
101+
baseURL,
102+
page,
103+
}) => {
104+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
105+
106+
await previewNhsAppTemplatePage.loadPage(sessions.valid.id);
107+
108+
await previewNhsAppTemplatePage.editRadioOption.click();
109+
110+
await previewNhsAppTemplatePage.clickContinueButton();
111+
112+
await expect(page).toHaveURL(
113+
`${baseURL}/templates/create-nhs-app-template/${sessions.valid.id}`
114+
);
115+
});
116+
117+
test('when user submits form with "Submit" data, then the "Are you sure you want to submit" page is displayed', async ({
118+
baseURL,
119+
page,
120+
}) => {
121+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
122+
123+
await previewNhsAppTemplatePage.loadPage(sessions.valid.id);
124+
125+
await previewNhsAppTemplatePage.submitRadioOption.click();
126+
127+
await previewNhsAppTemplatePage.clickContinueButton();
128+
129+
await expect(page).toHaveURL(
130+
`${baseURL}/templates/submit-nhs-app-template/${sessions.valid.id}`
131+
);
132+
});
133+
});
134+
135+
test.describe('Error handling', () => {
136+
test('when user visits page with missing data, then an invalid session error is displayed', async ({
137+
baseURL,
138+
page,
139+
}) => {
140+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
141+
142+
await previewNhsAppTemplatePage.loadPage(sessions.empty.id);
143+
144+
await expect(page).toHaveURL(`${baseURL}/templates/invalid-session`);
145+
});
146+
147+
test('when user visits page with a fake session, then an invalid session error is displayed', async ({
148+
baseURL,
149+
page,
150+
}) => {
151+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
152+
153+
await previewNhsAppTemplatePage.loadPage('/fake-session-id');
154+
155+
await expect(page).toHaveURL(`${baseURL}/templates/invalid-session`);
156+
});
157+
158+
test('when user submits page with no data, then an error is displayed', async ({
159+
page,
160+
}) => {
161+
const errorMessage = 'Select an option';
162+
163+
const previewNhsAppTemplatePage = new TemplateMgmtPreviewNhsAppPage(page);
164+
165+
await previewNhsAppTemplatePage.loadPage(sessions.valid.id);
166+
167+
await previewNhsAppTemplatePage.clickContinueButton();
168+
169+
await expect(previewNhsAppTemplatePage.errorSummary).toBeVisible();
170+
171+
const selectOptionErrorLink =
172+
previewNhsAppTemplatePage.errorSummary.locator(
173+
'[href="#reviewNHSAppTemplateAction"]'
174+
);
175+
176+
await expect(selectOptionErrorLink).toHaveText(errorMessage);
177+
178+
await selectOptionErrorLink.click();
179+
180+
await expect(
181+
page.locator('#reviewNHSAppTemplateAction')
182+
).toBeInViewport();
183+
});
184+
});
185+
});

tests/test-team/template-mgmt-component-tests/template-mgmt-submit-page.component.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ const smsFields = {
3030
smsTemplateMessage: 'test-template-message',
3131
};
3232

33+
const nhsAppFields = {
34+
nhsAppTemplateName: 'test-template-name',
35+
nhsAppTemplateMessage: 'test-template-message',
36+
};
37+
3338
const sessions = {
3439
email: {
3540
empty: SessionFactory.createEmailSession('empty-email-submit-session'),
@@ -61,6 +66,23 @@ const sessions = {
6166
...smsFields,
6267
},
6368
},
69+
'nhs-app': {
70+
empty: SessionFactory.createNhsAppSession('empty-nhs-app-submit-session'),
71+
submit: {
72+
...SessionFactory.createNhsAppSession('submit-nhs-app-submit-session'),
73+
...nhsAppFields,
74+
},
75+
submitAndReturn: {
76+
...SessionFactory.createNhsAppSession(
77+
'submit-and-return-nhs-app-session'
78+
),
79+
...smsFields,
80+
},
81+
valid: {
82+
...SessionFactory.createNhsAppSession('valid-nhs-app-submit-session'),
83+
...smsFields,
84+
},
85+
},
6486
};
6587

6688
const sessionsList = [

0 commit comments

Comments
 (0)