@ministryofjustice/hmpps-probation-integration-e2e-tests 1.181.0 → 1.182.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 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.181.0",
4
+ "version": "1.182.0",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ministryofjustice/hmpps-probation-integration-e2e-tests#readme",
7
7
  "bugs": {
@@ -1,7 +1,7 @@
1
1
  import { Yesterday } from "../../delius/utils/date-time.mjs";
2
2
  import { getToken } from "../auth/get-token.mjs";
3
- import { retry, sanitiseError } from "../utils/api-utils.mjs";
4
3
  import { setNomisId } from "../../delius/offender/update-offender.mjs";
4
+ import { retry, sanitiseError } from "../utils/api-utils.mjs";
5
5
  import { request } from "@playwright/test";
6
6
  import { DateTime } from "luxon";
7
7
  import { faker } from "@faker-js/faker";
@@ -1,3 +1,4 @@
1
+ import { Person } from "../utils/person.mjs";
1
2
  import { Allocation } from "../../../test-data/test-data.mjs";
2
3
  import { Page } from "@playwright/test";
3
4
 
@@ -5,6 +6,7 @@ import { Page } from "@playwright/test";
5
6
  declare function findOffenderByName(page: Page, forename: string, surname: string): Promise<void>;
6
7
  declare function findOffenderByCRN(page: Page, crn: string): Promise<void>;
7
8
  declare function findOffenderByCRNNoContextCheck(page: Page, crn: string): Promise<void>;
9
+ declare function findFirstOffender(page: Page, person: Person, provider: string): Promise<string>;
8
10
  declare function findOffenderByNomisId(page: Page, nomisId: string): Promise<string>;
9
11
  declare function verifyAllocation(page: Page, args: {
10
12
  allocation: Allocation;
@@ -13,4 +15,4 @@ declare function verifyAllocation(page: Page, args: {
13
15
  declare function isInOffenderContext(page: Page, crn: string): Promise<boolean>;
14
16
  declare function dismissModals(page: Page): Promise<void>;
15
17
  //#endregion
16
- export { dismissModals, findOffenderByCRN, findOffenderByCRNNoContextCheck, findOffenderByName, findOffenderByNomisId, isInOffenderContext, verifyAllocation };
18
+ export { dismissModals, findFirstOffender, findOffenderByCRN, findOffenderByCRNNoContextCheck, findOffenderByName, findOffenderByNomisId, isInOffenderContext, verifyAllocation };
@@ -33,6 +33,20 @@ async function findOffenderByCRNNoContextCheck(page, crn) {
33
33
  await page.locator("tr", { hasText: crn }).locator("a", { hasText: "View" }).click();
34
34
  await expect(page).toHaveTitle(/Case Summary/);
35
35
  }
36
+ async function findFirstOffender(page, person, provider) {
37
+ await page.locator("#navigation-include\\:linkNavigation1Search", { hasText: "National search" }).click();
38
+ await expect(page).toHaveTitle(/National Search/);
39
+ await page.fill("#firstName\\:inputText", person.firstName);
40
+ await page.fill("#lastName\\:inputText", person.lastName);
41
+ await selectOption(page, "#sex\\:selectOneMenu", person.sex);
42
+ await selectOption(page, "#provider\\:selectOneMenu", provider);
43
+ await page.click("#searchButton");
44
+ const noRecordsMessage = page.locator(".noRecordsFound:has-text(\"No records found\")");
45
+ const offendersTable = page.locator("#offendersTable");
46
+ await expect(noRecordsMessage.or(offendersTable)).toBeVisible({ timeout: 1e4 });
47
+ if (await offendersTable.isVisible()) return await page.locator("#offendersTable tbody tr:first-child td:first-child").textContent();
48
+ else if (await noRecordsMessage.isVisible()) return null;
49
+ }
36
50
  async function findOffenderByNomisId(page, nomisId) {
37
51
  await page.locator("a", { hasText: "National search" }).click();
38
52
  await expect(page).toHaveTitle(/National Search/);
@@ -68,4 +82,4 @@ async function dismissModals(page) {
68
82
  } catch (_) {}
69
83
  }
70
84
  //#endregion
71
- export { dismissModals, findOffenderByCRN, findOffenderByCRNNoContextCheck, findOffenderByName, findOffenderByNomisId, isInOffenderContext, verifyAllocation };
85
+ export { dismissModals, findFirstOffender, findOffenderByCRN, findOffenderByCRNNoContextCheck, findOffenderByName, findOffenderByNomisId, isInOffenderContext, verifyAllocation };
@@ -2,6 +2,7 @@ import { Page } from "@playwright/test";
2
2
 
3
3
  //#region steps/delius/upw/allocate-current-case-to-upw-project.d.ts
4
4
  declare function allocateCurrentCaseToUpwProject(page: Page, {
5
+ crn,
5
6
  providerName,
6
7
  teamName,
7
8
  projectName,
@@ -11,6 +12,7 @@ declare function allocateCurrentCaseToUpwProject(page: Page, {
11
12
  projectType,
12
13
  pickupPoint
13
14
  }: {
15
+ crn: string;
14
16
  providerName: string;
15
17
  teamName: string;
16
18
  projectName?: string;
@@ -20,5 +22,12 @@ declare function allocateCurrentCaseToUpwProject(page: Page, {
20
22
  projectType?: string;
21
23
  pickupPoint?: string;
22
24
  }): Promise<void>;
25
+ declare const setAllocationOutcome: (page: Page, {
26
+ crn,
27
+ contactOutcome
28
+ }: {
29
+ crn: string;
30
+ contactOutcome?: string;
31
+ }) => Promise<void>;
23
32
  //#endregion
24
- export { allocateCurrentCaseToUpwProject };
33
+ export { allocateCurrentCaseToUpwProject, setAllocationOutcome };
@@ -1,10 +1,10 @@
1
1
  import { getCurrentDay } from "../utils/date-time.mjs";
2
2
  import { selectOption } from "../utils/inputs.mjs";
3
+ import { findOffenderByCRN } from "../offender/find-offender.mjs";
3
4
  import { expect } from "@playwright/test";
4
5
  //#region steps/delius/upw/allocate-current-case-to-upw-project.ts
5
- async function allocateCurrentCaseToUpwProject(page, { providerName, teamName, projectName = null, day = getCurrentDay(), startTime = "10:00", endTime = "16:00", projectType = "Group Placement - National Project", pickupPoint = null }) {
6
- await expect(page.locator("#content > h1")).toContainText("Personal Details");
7
- await page.getByRole("button", { name: "Update" }).click();
6
+ async function allocateCurrentCaseToUpwProject(page, { crn, providerName, teamName, projectName = null, day = getCurrentDay(), startTime = "10:00", endTime = "16:00", projectType = "Group Placement - National Project", pickupPoint = null }) {
7
+ await findOffenderByCRN(page, crn);
8
8
  await page.getByRole("link", { name: "Event List" }).click();
9
9
  await page.getByRole("link", {
10
10
  name: "view",
@@ -31,5 +31,15 @@ async function allocateCurrentCaseToUpwProject(page, { providerName, teamName, p
31
31
  await expect(page.locator("#content > h1")).toContainText("View UPW Details");
32
32
  console.log("Case allocated to UPW project '%s' on %s", projectName, day);
33
33
  }
34
+ const setAllocationOutcome = async (page, { crn, contactOutcome = "Rescheduled - Service Request" }) => {
35
+ await findOffenderByCRN(page, crn);
36
+ await page.getByRole("link", { name: "Event List" }).click();
37
+ await page.locator("#eventsTable tbody tr").first().locator("a[title=\"View event\"]").click();
38
+ await page.getByRole("link", { name: "Unpaid work" }).click();
39
+ await page.getByRole("button", { name: "Worksheet Summary" }).click();
40
+ await page.locator("#appointmentsTable tbody tr").first().locator("a[title=\"Link to update the UPW attendance details.\"]").click();
41
+ await selectOption(page, "#contactOutcome\\:selectOneMenu", contactOutcome);
42
+ await page.getByRole("button", { name: "Save" }).click();
43
+ };
34
44
  //#endregion
35
- export { allocateCurrentCaseToUpwProject };
45
+ export { allocateCurrentCaseToUpwProject, setAllocationOutcome };
@@ -9,6 +9,15 @@ interface ProjectAvailability {
9
9
  startTime?: string;
10
10
  endTime?: string;
11
11
  }
12
+ declare function uwpProjectExists(page: Page, {
13
+ projectName,
14
+ provider,
15
+ team
16
+ }: {
17
+ projectName: string;
18
+ provider: string;
19
+ team: string;
20
+ }): Promise<boolean>;
12
21
  declare function createUpwProject(page: Page, {
13
22
  providerName,
14
23
  teamName,
@@ -34,4 +43,4 @@ declare function createUpwProject(page: Page, {
34
43
  }>;
35
44
  declare function createNameWithTimeStamp(prefix?: string): string;
36
45
  //#endregion
37
- export { createNameWithTimeStamp, createUpwProject };
46
+ export { createNameWithTimeStamp, createUpwProject, uwpProjectExists };
@@ -5,6 +5,21 @@ import { expect } from "@playwright/test";
5
5
  import { DateTime } from "luxon";
6
6
  import { faker } from "@faker-js/faker";
7
7
  //#region steps/delius/upw/create-upw-project.ts
8
+ async function uwpProjectExists(page, { projectName, provider, team }) {
9
+ await page.getByRole("link", { name: "UPW Projects" }).click();
10
+ await expect(page.locator("#content > h1")).toContainText("UPW Projects List");
11
+ await page.selectOption("#Trust\\:selectOneMenu", provider);
12
+ await page.selectOption("#Team\\:selectOneMenu", team);
13
+ await page.getByRole("link", {
14
+ name: "Search",
15
+ exact: true
16
+ }).click();
17
+ while (true) {
18
+ if (await page.locator("#resultsTable td").filter({ hasText: projectName }).count() > 0) return true;
19
+ if (!await page.locator("a:has-text(\"Next\")").click({ timeout: 1e3 }).catch(() => false)) break;
20
+ }
21
+ return false;
22
+ }
8
23
  async function createUpwProject(page, { providerName, teamName, projectType = "Group Placement - National Project", pickupPoint = "Chelmsford", projectName = createNameWithTimeStamp(), projectCode = faker.string.alphanumeric(6), endDate = Tomorrow.toJSDate(), projectAvailability = {} }) {
9
24
  await page.getByRole("link", { name: "UPW Projects" }).click();
10
25
  await expect(page.locator("#content > h1")).toContainText("UPW Projects List");
@@ -62,4 +77,4 @@ async function addProjectAvailability(page, projectAvailability) {
62
77
  };
63
78
  }
64
79
  //#endregion
65
- export { createNameWithTimeStamp, createUpwProject };
80
+ export { createNameWithTimeStamp, createUpwProject, uwpProjectExists };