Skip to content

Commit f20a858

Browse files
letter test data utility manual fixes
1 parent 5c2b284 commit f20a858

8 files changed

Lines changed: 96 additions & 170 deletions

File tree

package-lock.json

Lines changed: 1 addition & 152 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/utilities/letter-test-data/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"@aws-sdk/client-s3": "^3.858.0",
55
"@aws-sdk/lib-dynamodb": "^3.858.0",
66
"@internal/datastore": "*",
7+
"@jest/globals": "^30.2.0",
78
"esbuild": "^0.25.11",
89
"pino": "^9.7.0",
910
"yargs": "^17.7.2"

scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts renamed to scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { LetterStatusType } from "@internal/datastore";
33
import {
44
createLetter,
55
createLetterDto,
6-
} from "../../helpers/create_letter_helpers";
7-
import { uploadFile } from "../../helpers/s3_helpers";
6+
} from "../../helpers/create-letter-helpers";
7+
import uploadFile from "../../helpers/s3-helpers";
88

9-
jest.mock("../../helpers/s3_helpers");
9+
jest.mock("../../helpers/s3-helpers");
1010

1111
describe("Create letter helpers", () => {
1212
beforeEach(() => {
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { jest } from "@jest/globals";
2+
3+
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4+
import { readFileSync } from "node:fs";
5+
import uploadFile from "../../helpers/s3-helpers";
6+
7+
jest.mock("@aws-sdk/client-s3", () => ({
8+
S3Client: jest.fn(),
9+
PutObjectCommand: jest.fn((params: unknown) => params),
10+
}));
11+
12+
jest.mock("node:fs", () => ({
13+
readFileSync: jest.fn(() => Buffer.from("pdf-data")),
14+
}));
15+
16+
describe("s3-helpers - uploadFile", () => {
17+
beforeEach(() => {
18+
jest.clearAllMocks();
19+
});
20+
21+
it("uploads file with correct params", async () => {
22+
const bucket = "my-bucket";
23+
const supplierId = "supplier-123";
24+
const sourceFilename = "fixtures/sample.pdf";
25+
const targetFilename = "upload.pdf";
26+
27+
const sendMock = jest.fn().mockResolvedValue({ ETag: "etag-value" });
28+
(S3Client as unknown as jest.Mock).mockImplementation(() => ({
29+
send: sendMock,
30+
}));
31+
32+
const result = await uploadFile(
33+
bucket,
34+
supplierId,
35+
sourceFilename,
36+
targetFilename,
37+
);
38+
39+
expect(readFileSync).toHaveBeenCalled();
40+
expect(PutObjectCommand).toHaveBeenCalledWith({
41+
Bucket: bucket,
42+
Key: `${supplierId}/${targetFilename}`,
43+
Body: expect.any(Buffer),
44+
ContentType: "application/pdf",
45+
});
46+
47+
const putArgs = (PutObjectCommand as jest.Mock).mock.results[0].value;
48+
expect(sendMock).toHaveBeenCalledWith(putArgs);
49+
expect(result).toEqual({ ETag: "etag-value" });
50+
});
51+
52+
it("throws and logs error when upload fails", async () => {
53+
const bucket = "my-bucket";
54+
const supplierId = "supplier-err";
55+
const sourceFilename = "fixtures/missing.pdf";
56+
const targetFilename = "upload.pdf";
57+
58+
const sendMock = jest.fn().mockRejectedValue(new Error("S3 failure"));
59+
(S3Client as unknown as jest.Mock).mockImplementation(() => ({
60+
send: sendMock,
61+
}));
62+
63+
const consoleErrorSpy = jest
64+
.spyOn(console, "error")
65+
.mockImplementation(() => {});
66+
67+
await expect(
68+
uploadFile(bucket, supplierId, sourceFilename, targetFilename),
69+
).rejects.toThrow("S3 failure");
70+
71+
expect(sendMock).toHaveBeenCalled();
72+
expect(consoleErrorSpy).toHaveBeenCalledWith(
73+
"Error uploading file:",
74+
expect.any(Error),
75+
);
76+
77+
consoleErrorSpy.mockRestore();
78+
});
79+
});

scripts/utilities/letter-test-data/src/cli/index.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { randomUUID } from "node:crypto";
55
import {
66
createLetter,
77
createLetterDto,
8-
} from "../helpers/create_letter_helpers";
9-
import { createLetterRepository } from "../infrastructure/letter-repo-factory";
10-
import { uploadFile } from "../helpers/s3_helpers";
8+
} from "../helpers/create-letter-helpers";
9+
import createLetterRepository from "../infrastructure/letter-repo-factory";
10+
import uploadFile from "../helpers/s3-helpers";
1111

1212
async function main() {
1313
await yargs(hideBin(process.argv))
@@ -64,13 +64,11 @@ async function main() {
6464
},
6565
async (argv) => {
6666
const { supplierId } = argv;
67-
const letterId = argv.letterId ? argv.letterId : randomUUID();
67+
const letterId = argv.letterId ?? randomUUID();
6868
const bucketName = `nhs-${argv.awsAccountId}-eu-west-2-${argv.environment}-supapi-test-letters`;
6969
const targetFilename = `${letterId}.pdf`;
70-
const groupId = argv.groupId ? argv.groupId : randomUUID();
71-
const specificationId = argv.specificationId
72-
? argv.specificationId
73-
: randomUUID();
70+
const groupId = argv.groupId ?? randomUUID();
71+
const specificationId = argv.specificationId ?? randomUUID();
7472
const { status } = argv;
7573
const { environment } = argv;
7674
const { ttlHours } = argv;
@@ -145,10 +143,8 @@ async function main() {
145143

146144
// parse args
147145
const { supplierId } = argv;
148-
const groupId = argv.groupId ? argv.groupId : randomUUID();
149-
const specificationId = argv.specificationId
150-
? argv.specificationId
151-
: randomUUID();
146+
const groupId = argv.groupId ?? randomUUID();
147+
const specificationId = argv.specificationId ?? randomUUID();
152148
const { status } = argv;
153149
const { environment } = argv;
154150
const { ttlHours } = argv;

scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts renamed to scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
LetterRepository,
44
LetterStatusType,
55
} from "@internal/datastore";
6-
import { uploadFile } from "./s3_helpers";
6+
import uploadFile from "./s3-helpers";
77

88
export async function createLetter(params: {
99
letterId: string;

scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts renamed to scripts/utilities/letter-test-data/src/helpers/s3-helpers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
22
import { readFileSync } from "node:fs";
33
import path from "node:path";
44

5-
export async function uploadFile(
5+
export default async function uploadFile(
66
bucketName: string,
77
supplierId: string,
88
sourceFilename: string,
@@ -24,5 +24,6 @@ export async function uploadFile(
2424
return await s3.send(command);
2525
} catch (error) {
2626
console.error("Error uploading file:", error);
27+
throw error;
2728
}
2829
}

scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
33
import { pino } from "pino";
44
import { LetterRepository } from "@internal/datastore";
55

6-
export function createLetterRepository(
6+
export default function createLetterRepository(
77
environment: string,
88
ttlHours: number,
99
): LetterRepository {

0 commit comments

Comments
 (0)