Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ healthcheck: /_status
url: https://suppliers.dev.nhsnotify.national.nhs.uk
security:
type: mtls
secret: nhs-notify-supplier-mtls-internal-dev
secret: nhs-notify-supplier-mtls-internal-dev-main
41 changes: 13 additions & 28 deletions tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { expect, test } from "@playwright/test";
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
import { getLettersBySupplier } from "../../helpers/generate-fetch-test-data";
import {
createTestData,
waitForLetterStatus,
} from "../../helpers/generate-fetch-test-data";
import {
DATA,
SUPPLIERID,
Expand All @@ -19,16 +22,17 @@ test.describe("API Gateway Tests to Verify Get Letter PDF Endpoint", () => {
test(`Get /letters/{id}/data returns 200 and valid response for a given id`, async ({
request,
}) => {
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 1);
const letterIds: string[] = await createTestData(SUPPLIERID);
const createdLetter = await waitForLetterStatus(
SUPPLIERID,
letterIds[0],
"PENDING",
);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letter = letters[0];
const headers = createValidRequestHeaders();

const response = await request.get(
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}/${DATA}`,
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}/${DATA}`,
{
headers,
},
Expand Down Expand Up @@ -63,32 +67,13 @@ test.describe("API Gateway Tests to Verify Get Letter PDF Endpoint", () => {
expect(after.status).toBe(403);
});

test(`Get /letters/{id}/data returns 404 if no resource is found for id`, async ({
request,
}) => {
const id = "11";
const headers = createValidRequestHeaders();
const response = await request.get(
`${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
{
headers,
},
);

const responseBody = await response.json();
expect(response.status()).toBe(404);
expect(responseBody).toMatchObject(error404ResponseBody());
});

// CCM-14318: Remove this test
test(`Get /letters/{id}/data returns 404 if letter is not found for supplierId ${SUPPLIERID}`, async ({
request,
}) => {
Comment thread
francisco-videira-nhs marked this conversation as resolved.
const id = "non-existing-id-12345";
const headers = createValidRequestHeaders();
const response = await request.get(
`
${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
`${baseUrl}/${SUPPLIER_LETTERS}/${id}/${DATA}`,
{
headers,
},
Expand Down
25 changes: 14 additions & 11 deletions tests/component-tests/apiGateway-tests/get-letter-status.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { expect, test } from "@playwright/test";
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
import { getLettersBySupplier } from "../../helpers/generate-fetch-test-data";
import {
createTestData,
waitForLetterStatus,
} from "../../helpers/generate-fetch-test-data";
import { SUPPLIERID, SUPPLIER_LETTERS } from "../../constants/api-constants";
import { createValidRequestHeaders } from "../../constants/request-headers";
import { error404ResponseBody } from "../../helpers/common-types";
Expand All @@ -15,16 +18,16 @@ test.describe("API Gateway Tests to Verify Get Letter Status Endpoint", () => {
test(`Get /letters/{id} returns 200 and valid response for a given id`, async ({
request,
}) => {
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 1);
const letterIds: string[] = await createTestData(SUPPLIERID);
const createdLetter = await waitForLetterStatus(
SUPPLIERID,
letterIds[0],
"PENDING",
);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letter = letters[0];
const headers = createValidRequestHeaders();
const response = await request.get(
`${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}`,
`${baseUrl}/${SUPPLIER_LETTERS}/${createdLetter.id}`,
{
headers,
},
Expand All @@ -37,10 +40,10 @@ test.describe("API Gateway Tests to Verify Get Letter Status Endpoint", () => {
data: {
attributes: {
status: "PENDING",
specificationId: letter.specificationId,
groupId: letter.groupId,
specificationId: createdLetter.specificationId,
groupId: createdLetter.groupId,
},
id: letter.id,
id: createdLetter.id,
type: "Letter",
},
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Letter } from "@internal/datastore";
import { RequestHeaders } from "../../../constants/request-headers";
import { SUPPLIERID } from "../../../constants/api-constants";
import {
ErrorMessageBody,
PostMessageRequestBody,
} from "../../../helpers/common-types";
import { SupplierApiLetters } from "../../../helpers/generate-fetch-test-data";

export interface LetterUpdateAttributes {
status: string;
Expand Down Expand Up @@ -43,7 +43,7 @@ export function postValidRequestBody(
}

export function postInvalidStatusRequestBody(
letters: SupplierApiLetters[],
letters: Letter[],
): PostMessageRequestBody {
return {
data: [
Expand All @@ -66,7 +66,7 @@ export function postInvalidStatusRequestBody(
}

export function postDuplicateIDRequestBody(
letters: SupplierApiLetters[],
letters: Letter[],
): PostMessageRequestBody {
return {
data: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import {
} from "./testCases/update-letter-status";
import {
createTestData,
getLettersBySupplier,
waitForLetterStatus,
} from "../../helpers/generate-fetch-test-data";
import { createInvalidRequestHeaders } from "../../constants/request-headers";
Expand All @@ -20,33 +19,26 @@ import {
} from "../../helpers/common-types";

let baseUrl: string;
let letters: Awaited<ReturnType<typeof getLettersBySupplier>>;

test.beforeAll(async () => {
baseUrl = await getRestApiGatewayBaseUrl();
});

test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
test.beforeAll(async () => {
await createTestData(SUPPLIERID, 2);
letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);

if (letters.length < 2) {
throw new Error(
`Expected 2 PENDING letters for supplier ${SUPPLIERID}, got ${letters.length}.`,
);
}
});

test(`Patch /letters returns 202 and status is updated to ACCEPTED`, async ({
request,
}) => {
const letter = letters[0];
const letterIds: string[] = await createTestData(SUPPLIERID);
const createdLetter = await waitForLetterStatus(
SUPPLIERID,
letterIds[0],
"PENDING",
);
const headers = patchRequestHeaders();
const body = patchValidRequestBody(letter.id, "ACCEPTED");
const body = patchValidRequestBody(createdLetter.id, "ACCEPTED");

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

const updated = await waitForLetterStatus(
SUPPLIERID,
letter.id,
createdLetter.id,
"ACCEPTED",
);
expect(updated.status).toBe("ACCEPTED");
Expand All @@ -66,12 +58,17 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => {
test(`Patch /letters returns 202 and status is updated to REJECTED`, async ({
request,
}) => {
const letter = letters[1];
const letterIds: string[] = await createTestData(SUPPLIERID);
const createdLetter = await waitForLetterStatus(
SUPPLIERID,
letterIds[0],
"PENDING",
);
const headers = patchRequestHeaders();
const body = patchFailureRequestBody(letter.id, "REJECTED");
const body = patchFailureRequestBody(createdLetter.id, "REJECTED");

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

const updated = await waitForLetterStatus(
SUPPLIERID,
letter.id,
createdLetter.id,
"REJECTED",
);
expect(updated.status).toBe("REJECTED");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
} from "./testCases/update-multiple-letter-status";
import {
createTestData,
getLettersBySupplier,
waitForLetterStatus,
} from "../../helpers/generate-fetch-test-data";

Expand All @@ -27,24 +26,21 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
test(`post /letters returns 202 and status is updated for multiple letters`, async ({
request,
}) => {
await createTestData(SUPPLIERID, 4);
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 4);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letterIds: string[] = await createTestData(SUPPLIERID, 4);
const createdLetters = await Promise.all(
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
);

const headers = postLettersRequestHeaders();
const updatesById = {
[letters[0].id]: { status: "ACCEPTED" },
[letters[1].id]: {
[createdLetters[0].id]: { status: "ACCEPTED" },
[createdLetters[1].id]: {
status: "REJECTED",
reasonCode: "R01",
reasonText: "Test Reason",
},
[letters[2].id]: { status: "PRINTED" },
[letters[3].id]: { status: "CANCELLED" },
[createdLetters[2].id]: { status: "PRINTED" },
[createdLetters[3].id]: { status: "CANCELLED" },
};

const body = postValidRequestBody(updatesById);
Expand All @@ -71,16 +67,13 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
test(`Post /letters returns 400 if request has invalid status`, async ({
request,
}) => {
await createTestData(SUPPLIERID, 2);
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letterIds: string[] = await createTestData(SUPPLIERID, 2);
const createdLetters = await Promise.all(
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
);

const headers = postLettersRequestHeaders();
const body = postInvalidStatusRequestBody(letters);
const body = postInvalidStatusRequestBody(createdLetters);

const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {
headers,
Expand All @@ -96,16 +89,13 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
test(`Post /letters returns 400 if request has duplicate id`, async ({
request,
}) => {
await createTestData(SUPPLIERID, 2);
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 2);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letterIds: string[] = await createTestData(SUPPLIERID, 2);
const createdLetters = await Promise.all(
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
);

const headers = postLettersRequestHeaders();
const body = postDuplicateIDRequestBody(letters);
const body = postDuplicateIDRequestBody(createdLetters);

const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {
headers,
Expand All @@ -121,24 +111,21 @@ test.describe("API Gateway Tests to Verify post Status Endpoint", () => {
test(`Post /letters returns 500 if request has invalid header`, async ({
request,
}) => {
await createTestData(SUPPLIERID, 4);
const letters = await getLettersBySupplier(SUPPLIERID, "PENDING", 4);

if (!letters?.length) {
test.fail(true, `No PENDING letters found for supplier ${SUPPLIERID}`);
return;
}
const letterIds: string[] = await createTestData(SUPPLIERID, 4);
const createdLetters = await Promise.all(
letterIds.map((id) => waitForLetterStatus(SUPPLIERID, id, "PENDING")),
);

const headers = postLettersInvalidRequestHeaders();
const body = postValidRequestBody({
[letters[0].id]: { status: "ACCEPTED" },
[letters[1].id]: {
[createdLetters[0].id]: { status: "ACCEPTED" },
[createdLetters[1].id]: {
status: "REJECTED",
reasonCode: "R01",
reasonText: "Test Reason",
},
[letters[2].id]: { status: "PRINTED" },
[letters[3].id]: { status: "CANCELLED" },
[createdLetters[2].id]: { status: "PRINTED" },
[createdLetters[3].id]: { status: "CANCELLED" },
});

const response = await request.post(`${baseUrl}/${SUPPLIER_LETTERS}`, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ test.describe("Event Subscription SNS Tests", () => {
supplierAllocatorLog.msg?.allocationDetails?.supplierSpec?.supplierId;

logger.info(
`Supplier ${supplierId} allocated for domainId ${domainId} in supplier allocator lambda`,
`Supplier ${supplierId} allocated to letter ${domainId} in supplier allocator lambda`,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we call it letter, but the variable is called domainId?

);
if (!supplierId) {
throw new Error("supplierId was not found in supplier allocator log");
Expand Down Expand Up @@ -109,7 +109,7 @@ test.describe("Event Subscription SNS Tests", () => {
supplierAllocatorLog.msg?.allocationDetails?.supplierSpec?.supplierId;

logger.info(
`Supplier ${supplierId} allocated for domainId ${domainId} in supplier allocator lambda`,
`Supplier ${supplierId} allocated to letter ${domainId} in supplier allocator lambda`,
);
if (!supplierId) {
throw new Error("supplierId was not found in supplier allocator log");
Expand Down
Loading
Loading