@ministryofjustice/hmpps-probation-integration-e2e-tests 1.206.0 → 1.208.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -1
- package/steps/community-payback/case-admin-login.d.mts +6 -0
- package/steps/community-payback/case-admin-login.mjs +12 -0
- package/steps/community-payback/record-outcome.d.mts +11 -0
- package/steps/community-payback/record-outcome.mjs +92 -0
- package/steps/community-payback/supervisor-login.d.mts +6 -0
- package/steps/community-payback/supervisor-login.mjs +12 -0
- package/steps/delius/upw/create-upw-project.mjs +1 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ministryofjustice/hmpps-probation-integration-e2e-tests",
|
|
3
3
|
"description": "Playwright end to end tests for hmpps-probation-integration-services.",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.208.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/ministryofjustice/hmpps-probation-integration-e2e-tests#readme",
|
|
7
7
|
"bugs": {
|
|
@@ -94,6 +94,9 @@
|
|
|
94
94
|
"./steps/cas3-transitional-accommodation/application": "./steps/cas3-transitional-accommodation/application.mjs",
|
|
95
95
|
"./steps/cas3-transitional-accommodation/login": "./steps/cas3-transitional-accommodation/login.mjs",
|
|
96
96
|
"./steps/common/common": "./steps/common/common.mjs",
|
|
97
|
+
"./steps/community-payback/case-admin-login": "./steps/community-payback/case-admin-login.mjs",
|
|
98
|
+
"./steps/community-payback/record-outcome": "./steps/community-payback/record-outcome.mjs",
|
|
99
|
+
"./steps/community-payback/supervisor-login": "./steps/community-payback/supervisor-login.mjs",
|
|
97
100
|
"./steps/court-case/hearing-data": "./steps/court-case/hearing-data.mjs",
|
|
98
101
|
"./steps/court-case/prepare-case-for-sentence/application": "./steps/court-case/prepare-case-for-sentence/application.mjs",
|
|
99
102
|
"./steps/court-case/prepare-case-for-sentence/login": "./steps/court-case/prepare-case-for-sentence/login.mjs",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { expect } from "@playwright/test";
|
|
2
|
+
//#region steps/community-payback/case-admin-login.ts
|
|
3
|
+
const caseAdminLogin = async (page) => {
|
|
4
|
+
await page.goto(process.env.COMMUNITY_PAYBACK_URL);
|
|
5
|
+
await expect(page).toHaveTitle(/HMPPS Digital Services - Sign in/);
|
|
6
|
+
await page.fill("#username", process.env.DELIUS_USERNAME);
|
|
7
|
+
await page.fill("#password", process.env.DELIUS_PASSWORD);
|
|
8
|
+
await page.click("#submit");
|
|
9
|
+
await expect(page).toHaveTitle(/Community Payback/);
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { caseAdminLogin };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Person } from "../delius/utils/person.mjs";
|
|
2
|
+
import { Page } from "@playwright/test";
|
|
3
|
+
|
|
4
|
+
//#region steps/community-payback/record-outcome.d.ts
|
|
5
|
+
declare function recordAttendanceCompliedOutcome(page: Page, crn: string, startTime?: string, endTime?: string): Promise<void>;
|
|
6
|
+
declare function recordUnacceptableAbsenceOutcome(page: Page, crn: string, penaltyTimeHours?: string, penaltyTimeMinutes?: string): Promise<void>;
|
|
7
|
+
declare function adjustTravelTime(page: Page, hours: string, minutes: string): Promise<void>;
|
|
8
|
+
declare function findGroupSession(page: Page, crn: string, person: Person, projectName: string, provider: string, teamName: string): Promise<void>;
|
|
9
|
+
declare function findPlacementsWithHostPartner(page: Page, provider: string, teamName: string): Promise<string>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { adjustTravelTime, findGroupSession, findPlacementsWithHostPartner, recordAttendanceCompliedOutcome, recordUnacceptableAbsenceOutcome };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Yesterday } from "../delius/utils/date-time.mjs";
|
|
2
|
+
import { selectOption } from "../delius/utils/inputs.mjs";
|
|
3
|
+
import { expect } from "@playwright/test";
|
|
4
|
+
import { DateTime } from "luxon";
|
|
5
|
+
import { faker } from "@faker-js/faker";
|
|
6
|
+
//#region steps/community-payback/record-outcome.ts
|
|
7
|
+
async function recordAttendanceCompliedOutcome(page, crn, startTime, endTime) {
|
|
8
|
+
await page.getByText("Attended - Complied").click();
|
|
9
|
+
await page.locator("#notes").fill(faker.lorem.sentence());
|
|
10
|
+
await page.getByRole("radio", { name: "No, they are not sensitive" }).click();
|
|
11
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
12
|
+
if (startTime) await page.locator("#startTime").fill(startTime);
|
|
13
|
+
if (endTime) await page.locator("#endTime").fill(endTime);
|
|
14
|
+
await page.locator("#penaltyTimeHours").fill("1");
|
|
15
|
+
await page.locator("#penaltyTimeMinutes").fill("0");
|
|
16
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
17
|
+
await page.locator("input[name=\"hiVis\"][value=\"yes\"]").click();
|
|
18
|
+
await page.locator("input[name=\"workedIntensively\"][value=\"yes\"]").click();
|
|
19
|
+
await page.locator("input[name=\"workQuality\"][value=\"GOOD\"]").click();
|
|
20
|
+
await page.locator("input[name=\"behaviour\"][value=\"GOOD\"]").click();
|
|
21
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
22
|
+
await page.getByRole("heading", { name: "Confirm details" }).isVisible();
|
|
23
|
+
await page.locator("input[name=\"alertPractitioner\"][value=\"no\"]").click();
|
|
24
|
+
await page.getByRole("button", { name: "Confirm" }).click();
|
|
25
|
+
await page.pause();
|
|
26
|
+
await expect(page.getByRole("heading", { name: "Success" })).toBeVisible();
|
|
27
|
+
await expect(page.locator(".govuk-notification-banner__content h3")).toContainText(/Attendance recorded/);
|
|
28
|
+
await page.getByRole("link", { name: "Sign out" }).click();
|
|
29
|
+
}
|
|
30
|
+
async function recordUnacceptableAbsenceOutcome(page, crn, penaltyTimeHours = "2", penaltyTimeMinutes = "30") {
|
|
31
|
+
page.locator("h1.govuk-fieldset__heading");
|
|
32
|
+
await page.pause();
|
|
33
|
+
await page.getByText("Unacceptable Absence").click();
|
|
34
|
+
await page.locator("#notes").fill(faker.lorem.sentence());
|
|
35
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
36
|
+
await page.locator("#penaltyTimeHours").fill(penaltyTimeHours);
|
|
37
|
+
await page.locator("#penaltyTimeMinutes").fill(penaltyTimeMinutes);
|
|
38
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
39
|
+
await page.pause();
|
|
40
|
+
await page.getByRole("heading", { name: "Confirm details" }).isVisible();
|
|
41
|
+
await expect(page.locator(".moj-alert__content")).toContainText(/This outcome will be shared with the practitioner as it requires enforcement action./);
|
|
42
|
+
await page.getByRole("link", { name: "Sign out" }).click();
|
|
43
|
+
}
|
|
44
|
+
async function adjustTravelTime(page, hours, minutes) {
|
|
45
|
+
await page.locator("#hours").fill(hours);
|
|
46
|
+
await page.locator("#minutes").fill(minutes);
|
|
47
|
+
await page.getByRole("button", { name: "Credit travel time" }).click();
|
|
48
|
+
await expect(page.locator("#success-title-1")).toContainText(/Success/);
|
|
49
|
+
const hoursString = hours === "1" ? "hour" : "hours";
|
|
50
|
+
const minutesString = hours === "1" ? "minute" : "minutes";
|
|
51
|
+
await expect(page.locator(".govuk-notification-banner__content h3")).toContainText(RegExp(` has been adjusted for ${hours} ${hoursString} ${minutes} ${minutesString} of travel time.`, "i"));
|
|
52
|
+
await page.getByRole("link", { name: "Sign out" }).click();
|
|
53
|
+
}
|
|
54
|
+
async function findGroupSession(page, crn, person, projectName, provider, teamName) {
|
|
55
|
+
const today = DateTime.now();
|
|
56
|
+
const supervisor = "Unallocated Unallocated";
|
|
57
|
+
await page.getByRole("link", { name: "Record group session" }).click();
|
|
58
|
+
await selectOption(page, "#provider", provider);
|
|
59
|
+
await selectOption(page, "#team", teamName);
|
|
60
|
+
await page.locator("#startDate-day").fill(Yesterday.day.toString());
|
|
61
|
+
await page.locator("#startDate-month").fill(Yesterday.month.toString());
|
|
62
|
+
await page.locator("#startDate-year").fill(Yesterday.year.toString());
|
|
63
|
+
await page.locator("#endDate-day").fill(today.day.toString());
|
|
64
|
+
await page.locator("#endDate-month").fill(today.month.toString());
|
|
65
|
+
await page.locator("#endDate-year").fill(today.year.toString());
|
|
66
|
+
await page.getByRole("button", { name: "Apply filters" }).click();
|
|
67
|
+
await page.getByRole("link", { name: projectName }).click();
|
|
68
|
+
await expect(page.locator("h1.govuk-heading-l")).toContainText(projectName);
|
|
69
|
+
await page.getByRole("cell", { name: person.firstName + person.lastName }).isVisible();
|
|
70
|
+
await page.getByRole("cell", { name: crn }).isVisible();
|
|
71
|
+
await page.getByRole("link", { name: "Update" }).click();
|
|
72
|
+
await expect(page.locator(".govuk-caption-l")).toContainText(crn);
|
|
73
|
+
await selectOption(page, "#supervisor", supervisor);
|
|
74
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
75
|
+
}
|
|
76
|
+
async function findPlacementsWithHostPartner(page, provider, teamName) {
|
|
77
|
+
await page.pause();
|
|
78
|
+
const supervisor = "Unallocated Staff";
|
|
79
|
+
await page.getByRole("link", { name: "Record attendance with host" }).click();
|
|
80
|
+
await selectOption(page, "#provider", provider);
|
|
81
|
+
await selectOption(page, "#team", teamName);
|
|
82
|
+
await page.getByRole("button", { name: "Apply filters" }).click();
|
|
83
|
+
await page.getByRole("cell").first().click();
|
|
84
|
+
await page.getByRole("link", { name: "Update" }).first().click();
|
|
85
|
+
const crn = await page.locator(".govuk-caption-l").textContent();
|
|
86
|
+
await expect(page.locator("h2.govuk-heading-m")).toContainText("Appointment details");
|
|
87
|
+
await selectOption(page, "#supervisor", supervisor);
|
|
88
|
+
await page.getByRole("button", { name: "Continue" }).click();
|
|
89
|
+
return crn;
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { adjustTravelTime, findGroupSession, findPlacementsWithHostPartner, recordAttendanceCompliedOutcome, recordUnacceptableAbsenceOutcome };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { expect } from "@playwright/test";
|
|
2
|
+
//#region steps/community-payback/supervisor-login.ts
|
|
3
|
+
const supervisorLogin = async (page) => {
|
|
4
|
+
await page.goto(process.env.COMMUNITY_PAYBACK_SUPERVISORS_URL);
|
|
5
|
+
await expect(page).toHaveTitle(/HMPPS Digital Services - Sign in/);
|
|
6
|
+
await page.fill("#username", process.env.DELIUS_USERNAME);
|
|
7
|
+
await page.fill("#password", process.env.DELIUS_PASSWORD);
|
|
8
|
+
await page.click("#submit");
|
|
9
|
+
await expect(page.locator("h1.govuk-heading-l")).toContainText(/Next sessions/);
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { supervisorLogin };
|
|
@@ -28,6 +28,7 @@ async function createUpwProject(page, { providerName, teamName, projectType = "G
|
|
|
28
28
|
await selectOption(page, "#Trust\\:selectOneMenu", providerName);
|
|
29
29
|
await selectOption(page, "#Team\\:selectOneMenu", teamName);
|
|
30
30
|
await page.selectOption("#ProjectType\\:selectOneMenu", projectType);
|
|
31
|
+
await waitForAjax(page);
|
|
31
32
|
await page.selectOption("#DefaultPickupPoint\\:selectOneMenu", { label: pickupPoint });
|
|
32
33
|
await page.fill("#ProjectCode\\:prependedInputText", projectCode);
|
|
33
34
|
await page.fill("#ProjectName\\:inputText", projectName);
|