Skip to content
Open
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
111 changes: 111 additions & 0 deletions tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import { expect, test } from "@playwright/test";
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
import { getLettersBySupplier } from "../../helpers/generate-fetch-test-data";
import {
DATA,
SUPPLIERID,
SUPPLIER_LETTERS,
} from "../../constants/api-constants";
import { createValidRequestHeaders } from "../../constants/request-headers";
import {
error404ResponseBody,
error500ResponseBody,
} from "../../helpers/common-types";

let baseUrl: string;

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

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);

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}`,
{
headers,
},
);

expect(response.status()).toBe(200);
// const responseBody = await response.text();
// expect(responseBody).toContain("PDF");

async function fetchAndValidatePdf(url: string) {
const res = await request.get(url, { headers });
return {
status: res.status(),
headers: res.headers(),
buffer: await res.body().catch(() => null),
text: await res.text().catch(() => null),
};
}

const pdfUrl = await response.url();
const parsed = new URL(pdfUrl);
const expiresParam = parsed.searchParams.get("X-Amz-Expires");

expect(expiresParam).toBeTruthy();
const expiresSeconds = Number(expiresParam);
expect(Number.isFinite(expiresSeconds)).toBeTruthy();

// Validate the URL works immediately
const url = await fetchAndValidatePdf(pdfUrl);
expect(url.status).toBe(200);
expect(url.headers["content-type"] || "").toContain("application/pdf");

const waitMs = Math.max(expiresSeconds * 1000 + 2000, 0);
if (waitMs > 0) {
// Cap wait to avoid extremely long waits
const MAX_WAIT_MS = 120_000; // 2 minutes cap
const effectiveWait = Math.min(waitMs, MAX_WAIT_MS);
await new Promise((resolve) => {
setTimeout(resolve, effectiveWait);
});

const after = await fetchAndValidatePdf(pdfUrl);
expect([400, 403]).toContain(after.status);
}
});

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());
});

test(`Get /letters/{id}/data returns 500 if letter is not found for supplierId ${SUPPLIERID}`, async ({
request,
}) => {
const id = "non-existing-id-12345";
const headers = createValidRequestHeaders();
const response = await request.get(`${baseUrl}/${SUPPLIER_LETTERS}/${id}`, {
headers,
});

const responseBody = await response.json();
expect(response.status()).toBe(500);
expect(responseBody).toMatchObject(error500ResponseBody());
});
});
2 changes: 1 addition & 1 deletion tests/config/playwright.base.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const envMaxInstances = Number.parseInt(process.env.WORKERS_MAX_INST!) || 10;
*/
export const config: PlaywrightTestConfig = {
/* Maximum time one test can run for. */
timeout: 60 * 1000,
timeout: 80 * 1000,
workers: envMaxInstances,
expect: {
/**
Expand Down
1 change: 1 addition & 0 deletions tests/constants/api-constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export const SUPPLIERID = "TestSupplier1";
export const MI_ENDPOINT = "mi";
export const SUPPLIERTABLENAME = `nhs-${envName}-supapi-suppliers`;
export const UPSERT_LETTER_LAMBDA_ARN = `arn:aws:lambda:eu-west-2:820178564574:function:nhs-${envName}-supapi-upsertletter`;
export const DATA = "data";
Loading