Skip to content

Commit fc6ef15

Browse files
CCM-18631: stabilise component tests (#602)
* stabilise component tests * pnpm to npm * clean up schemas and utils * clean up url * improve test order, log, and retries * fix import
1 parent 7d7fdd2 commit fc6ef15

14 files changed

Lines changed: 131 additions & 164 deletions

File tree

specification/api/components/environments/internal-dev/target.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ healthcheck: /_status
33
url: https://suppliers.dev.nhsnotify.national.nhs.uk
44
security:
55
type: mtls
6-
secret: nhs-notify-supplier-mtls-internal-dev
6+
secret: nhs-notify-supplier-mtls-internal-dev-main

tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { expect, test } from "@playwright/test";
22
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
3-
import { getLettersBySupplier } from "../../helpers/generate-fetch-test-data";
3+
import {
4+
createTestData,
5+
waitForLetterStatus,
6+
} from "../../helpers/generate-fetch-test-data";
47
import {
58
DATA,
69
SUPPLIERID,
@@ -19,16 +22,17 @@ test.describe("API Gateway Tests to Verify Get Letter PDF Endpoint", () => {
1922
test(`Get /letters/{id}/data returns 200 and valid response for a given id`, async ({
2023
request,
2124
}) => {
22-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 1);
25+
const letterIds: string[] = await createTestData(SUPPLIERID);
26+
const createdLetter = await waitForLetterStatus(
27+
SUPPLIERID,
28+
letterIds[0],
29+
"PENDING",
30+
);
2331

24-
if (!letters?.length) {
25-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
26-
return;
27-
}
28-
const letter = letters[0];
2932
const headers = createValidRequestHeaders();
33+
3034
const response = await request.get(
31-
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}/${DATA}`,
35+
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}/${DATA}`,
3236
{
3337
headers,
3438
},
@@ -63,32 +67,13 @@ test.describe("API Gateway Tests to Verify Get Letter PDF Endpoint", () => {
6367
expect(after.status).toBe(403);
6468
});
6569

66-
test(`Get /letters/{id}/data returns 404 if no resource is found for id`, async ({
67-
request,
68-
}) => {
69-
const id = "11";
70-
const headers = createValidRequestHeaders();
71-
const response = await request.get(
72-
`${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
73-
{
74-
headers,
75-
},
76-
);
77-
78-
const responseBody = await response.json();
79-
expect(response.status()).toBe(404);
80-
expect(responseBody).toMatchObject(error404ResponseBody());
81-
});
82-
83-
// CCM-14318: Remove this test
8470
test(`Get /letters/{id}/data returns 404 if letter is not found for supplierId ${SUPPLIERID}`, async ({
8571
request,
8672
}) => {
8773
const id = "non-existing-id-12345";
8874
const headers = createValidRequestHeaders();
8975
const response = await request.get(
90-
`
91-
${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
76+
`${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
9277
{
9378
headers,
9479
},

tests/component-tests/apiGateway-tests/get-letter-status.spec.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { expect, test } from "@playwright/test";
22
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
3-
import { getLettersBySupplier } from "../../helpers/generate-fetch-test-data";
3+
import {
4+
createTestData,
5+
waitForLetterStatus,
6+
} from "../../helpers/generate-fetch-test-data";
47
import { SUPPLIERID, SUPPLIER_LETTERS } from "../../constants/api-constants";
58
import { createValidRequestHeaders } from "../../constants/request-headers";
69
import { error404ResponseBody } from "../../helpers/common-types";
@@ -15,16 +18,16 @@ test.describe("API Gateway Tests to Verify Get Letter Status Endpoint", () => {
1518
test(`Get /letters/{id} returns 200 and valid response for a given id`, async ({
1619
request,
1720
}) => {
18-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 1);
21+
const letterIds: string[] = await createTestData(SUPPLIERID);
22+
const createdLetter = await waitForLetterStatus(
23+
SUPPLIERID,
24+
letterIds[0],
25+
"PENDING",
26+
);
1927

20-
if (!letters?.length) {
21-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
22-
return;
23-
}
24-
const letter = letters[0];
2528
const headers = createValidRequestHeaders();
2629
const response = await request.get(
27-
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}`,
30+
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}`,
2831
{
2932
headers,
3033
},
@@ -37,10 +40,10 @@ test.describe("API Gateway Tests to Verify Get Letter Status Endpoint", () => {
3740
data: {
3841
attributes: {
3942
status: "PENDING",
40-
specificationId: letter.specificationId,
41-
groupId: letter.groupId,
43+
specificationId: createdLetter.specificationId,
44+
groupId: createdLetter.groupId,
4245
},
43-
id: letter.id,
46+
id: createdLetter.id,
4447
type: "Letter",
4548
},
4649
});

tests/component-tests/apiGateway-tests/testCases/update-multiple-letter-status.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
import { Letter } from "@internal/datastore";
12
import { RequestHeaders } from "../../../constants/request-headers";
23
import { SUPPLIERID } from "../../../constants/api-constants";
34
import {
45
ErrorMessageBody,
56
PostMessageRequestBody,
67
} from "../../../helpers/common-types";
7-
import { SupplierApiLetters } from "../../../helpers/generate-fetch-test-data";
88

99
export interface LetterUpdateAttributes {
1010
status: string;
@@ -43,7 +43,7 @@ export function postValidRequestBody(
4343
}
4444

4545
export function postInvalidStatusRequestBody(
46-
letters: SupplierApiLetters[],
46+
letters: Letter[],
4747
): PostMessageRequestBody {
4848
return {
4949
data: [
@@ -66,7 +66,7 @@ export function postInvalidStatusRequestBody(
6666
}
6767

6868
export function postDuplicateIDRequestBody(
69-
letters: SupplierApiLetters[],
69+
letters: Letter[],
7070
): PostMessageRequestBody {
7171
return {
7272
data: [

tests/component-tests/apiGateway-tests/update-letter-status.spec.ts

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
} from "./testCases/update-letter-status";
1111
import {
1212
createTestData,
13-
getLettersBySupplier,
1413
waitForLetterStatus,
1514
} from "../../helpers/generate-fetch-test-data";
1615
import { createInvalidRequestHeaders } from "../../constants/request-headers";
@@ -20,33 +19,26 @@ import {
2019
} from "../../helpers/common-types";
2120

2221
let baseUrl: string;
23-
let letters: Awaited<ReturnType<typeof getLettersBySupplier>>;
2422

2523
test.beforeAll(async () => {
2624
baseUrl = await getRestApiGatewayBaseUrl();
2725
});
2826

2927
test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
30-
test.beforeAll(async () => {
31-
await createTestData(SUPPLIERID, 2);
32-
letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);
33-
34-
if (letters.length < 2) {
35-
throw new Error(
36-
`Expected 2 PENDING letters for supplier ${SUPPLIERID}, got ${letters.length}.`,
37-
);
38-
}
39-
});
40-
4128
test(`Patch /letters returns 202 and status is updated to ACCEPTED`, async ({
4229
request,
4330
}) => {
44-
const letter = letters[0];
31+
const letterIds: string[] = await createTestData(SUPPLIERID);
32+
const createdLetter = await waitForLetterStatus(
33+
SUPPLIERID,
34+
letterIds[0],
35+
"PENDING",
36+
);
4537
const headers = patchRequestHeaders();
46-
const body = patchValidRequestBody(letter.id, "ACCEPTED");
38+
const body = patchValidRequestBody(createdLetter.id, "ACCEPTED");
4739

4840
const response = await request.patch(
49-
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}`,
41+
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}`,
5042
{
5143
headers,
5244
data: body,
@@ -57,7 +49,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
5749

5850
const updated = await waitForLetterStatus(
5951
SUPPLIERID,
60-
letter.id,
52+
createdLetter.id,
6153
"ACCEPTED",
6254
);
6355
expect(updated.status).toBe("ACCEPTED");
@@ -66,12 +58,17 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
6658
test(`Patch /letters returns 202 and status is updated to REJECTED`, async ({
6759
request,
6860
}) => {
69-
const letter = letters[1];
61+
const letterIds: string[] = await createTestData(SUPPLIERID);
62+
const createdLetter = await waitForLetterStatus(
63+
SUPPLIERID,
64+
letterIds[0],
65+
"PENDING",
66+
);
7067
const headers = patchRequestHeaders();
71-
const body = patchFailureRequestBody(letter.id, "REJECTED");
68+
const body = patchFailureRequestBody(createdLetter.id, "REJECTED");
7269

7370
const response = await request.patch(
74-
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}`,
71+
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}`,
7572
{
7673
headers,
7774
data: body,
@@ -82,7 +79,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
8279

8380
const updated = await waitForLetterStatus(
8481
SUPPLIERID,
85-
letter.id,
82+
createdLetter.id,
8683
"REJECTED",
8784
);
8885
expect(updated.status).toBe("REJECTED");

tests/component-tests/apiGateway-tests/update-multiple-letter-status.spec.ts

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
} from "./testCases/update-multiple-letter-status";
1414
import {
1515
createTestData,
16-
getLettersBySupplier,
1716
waitForLetterStatus,
1817
} from "../../helpers/generate-fetch-test-data";
1918

@@ -27,24 +26,21 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
2726
test(`post /letters returns 202 and status is updated for multiple letters`, async ({
2827
request,
2928
}) => {
30-
await createTestData(SUPPLIERID, 4);
31-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 4);
32-
33-
if (!letters?.length) {
34-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
35-
return;
36-
}
29+
const letterIds: string[] = await createTestData(SUPPLIERID, 4);
30+
const createdLetters = await Promise.all(
31+
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
32+
);
3733

3834
const headers = postLettersRequestHeaders();
3935
const updatesById = {
40-
[letters[0].id]: { status: "ACCEPTED" },
41-
[letters[1].id]: {
36+
[createdLetters[0].id]: { status: "ACCEPTED" },
37+
[createdLetters[1].id]: {
4238
status: "REJECTED",
4339
reasonCode: "R01",
4440
reasonText: "Test Reason",
4541
},
46-
[letters[2].id]: { status: "PRINTED" },
47-
[letters[3].id]: { status: "CANCELLED" },
42+
[createdLetters[2].id]: { status: "PRINTED" },
43+
[createdLetters[3].id]: { status: "CANCELLED" },
4844
};
4945

5046
const body = postValidRequestBody(updatesById);
@@ -71,16 +67,13 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
7167
test(`Post /letters returns 400 if request has invalid status`, async ({
7268
request,
7369
}) => {
74-
await createTestData(SUPPLIERID, 2);
75-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);
76-
77-
if (!letters?.length) {
78-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
79-
return;
80-
}
70+
const letterIds: string[] = await createTestData(SUPPLIERID, 2);
71+
const createdLetters = await Promise.all(
72+
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
73+
);
8174

8275
const headers = postLettersRequestHeaders();
83-
const body = postInvalidStatusRequestBody(letters);
76+
const body = postInvalidStatusRequestBody(createdLetters);
8477

8578
const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {
8679
headers,
@@ -96,16 +89,13 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
9689
test(`Post /letters returns 400 if request has duplicate id`, async ({
9790
request,
9891
}) => {
99-
await createTestData(SUPPLIERID, 2);
100-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);
101-
102-
if (!letters?.length) {
103-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
104-
return;
105-
}
92+
const letterIds: string[] = await createTestData(SUPPLIERID, 2);
93+
const createdLetters = await Promise.all(
94+
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
95+
);
10696

10797
const headers = postLettersRequestHeaders();
108-
const body = postDuplicateIDRequestBody(letters);
98+
const body = postDuplicateIDRequestBody(createdLetters);
10999

110100
const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {
111101
headers,
@@ -121,24 +111,21 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
121111
test(`Post /letters returns 500 if request has invalid header`, async ({
122112
request,
123113
}) => {
124-
await createTestData(SUPPLIERID, 4);
125-
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 4);
126-
127-
if (!letters?.length) {
128-
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
129-
return;
130-
}
114+
const letterIds: string[] = await createTestData(SUPPLIERID, 4);
115+
const createdLetters = await Promise.all(
116+
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
117+
);
131118

132119
const headers = postLettersInvalidRequestHeaders();
133120
const body = postValidRequestBody({
134-
[letters[0].id]: { status: "ACCEPTED" },
135-
[letters[1].id]: {
121+
[createdLetters[0].id]: { status: "ACCEPTED" },
122+
[createdLetters[1].id]: {
136123
status: "REJECTED",
137124
reasonCode: "R01",
138125
reasonText: "Test Reason",
139126
},
140-
[letters[2].id]: { status: "PRINTED" },
141-
[letters[3].id]: { status: "CANCELLED" },
127+
[createdLetters[2].id]: { status: "PRINTED" },
128+
[createdLetters[3].id]: { status: "CANCELLED" },
142129
});
143130

144131
const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {

tests/component-tests/events-tests/event-subscription.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ test.describe("Event Subscription SNS Tests", () => {
4141
supplierAllocatorLog.msg?.allocationDetails?.supplierSpec?.supplierId;
4242

4343
logger.info(
44-
`Supplier ${supplierId} allocated for domainId ${domainId} in supplier allocator lambda`,
44+
`Supplier ${supplierId} allocated to letter ${domainId} in supplier allocator lambda`,
4545
);
4646
if (!supplierId) {
4747
throw new Error("supplierId was not found in supplier allocator log");
@@ -109,7 +109,7 @@ test.describe("Event Subscription SNS Tests", () => {
109109
supplierAllocatorLog.msg?.allocationDetails?.supplierSpec?.supplierId;
110110

111111
logger.info(
112-
`Supplier ${supplierId} allocated for domainId ${domainId} in supplier allocator lambda`,
112+
`Supplier ${supplierId} allocated to letter ${domainId} in supplier allocator lambda`,
113113
);
114114
if (!supplierId) {
115115
throw new Error("supplierId was not found in supplier allocator log");

0 commit comments

Comments
 (0)