diff --git a/tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts b/tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts new file mode 100644 index 000000000..f705a49b2 --- /dev/null +++ b/tests/component-tests/apiGateway-tests/get-letter-pdf.spec.ts @@ -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()); + }); +}); diff --git a/tests/config/playwright.base.config.ts b/tests/config/playwright.base.config.ts index 736421abb..c9c9e7d0c 100644 --- a/tests/config/playwright.base.config.ts +++ b/tests/config/playwright.base.config.ts @@ -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: { /** diff --git a/tests/constants/api-constants.ts b/tests/constants/api-constants.ts index b08e1df0b..d453efb3d 100644 --- a/tests/constants/api-constants.ts +++ b/tests/constants/api-constants.ts @@ -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";