Skip to content

Commit b537ffc

Browse files
committed
fix api tests
1 parent 444569a commit b537ffc

File tree

8 files changed

+133
-45
lines changed

8 files changed

+133
-45
lines changed

frontend/src/components/molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ export default function PreviewTemplateDetailsLetter({
1717
}: {
1818
template: LetterTemplate;
1919
}) {
20-
console.log(template);
21-
2220
const proofFilenames = Object.values(template.files.proofs ?? {})
2321
.filter(({ virusScanStatus }) => virusScanStatus === 'PASSED')
2422
.map(({ fileName }) => fileName);

lambdas/backend-api/src/__tests__/templates/api/validate-letter-template-files.test.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,93 @@ describe('guard duty handler', () => {
148148
);
149149
});
150150

151+
test('validates a client-owned template', async () => {
152+
const { handler, mocks } = setup();
153+
154+
const clientId = 'clientid';
155+
156+
const event = makeGuardDutyMalwareScanResultNotificationEvent({
157+
detail: {
158+
s3ObjectDetails: {
159+
bucketName: 'quarantine-bucket',
160+
objectKey: `pdf-template/${clientId}/${templateId}/${versionId}.pdf`,
161+
},
162+
scanResultDetails: {
163+
scanResultStatus: 'NO_THREATS_FOUND',
164+
},
165+
},
166+
});
167+
168+
const template = mock<DatabaseTemplate>({
169+
files: {
170+
pdfTemplate: {
171+
fileName: '',
172+
virusScanStatus: 'PASSED',
173+
currentVersion: versionId,
174+
},
175+
testDataCsv: undefined,
176+
},
177+
templateStatus: 'PENDING_VALIDATION',
178+
language: 'en',
179+
owner: `CLIENT#${clientId}`,
180+
});
181+
182+
mocks.templateRepository.get.mockResolvedValueOnce({
183+
data: template,
184+
});
185+
186+
const pdfData = Uint8Array.from('pdf');
187+
188+
mocks.letterUploadRepository.download.mockResolvedValueOnce(pdfData);
189+
190+
mocks.clientConfigRepository.get.mockResolvedValueOnce({
191+
data: null,
192+
});
193+
194+
const pdf = mock<TemplatePdf>({
195+
personalisationParameters: ['firstName', 'parameter_1'],
196+
});
197+
mocks.TemplatePdf.mockImplementation(() => pdf);
198+
199+
mocks.validateLetterTemplateFiles.mockReturnValueOnce(true);
200+
201+
await handler(event);
202+
203+
expect(mocks.templateRepository.get).toHaveBeenCalledWith(templateId, {
204+
userId: clientId,
205+
clientId: clientId,
206+
});
207+
208+
expect(mocks.letterUploadRepository.download).toHaveBeenCalledWith(
209+
{ id: templateId, owner: clientId },
210+
'pdf-template',
211+
versionId
212+
);
213+
214+
expect(mocks.TemplatePdf).toHaveBeenCalledWith(
215+
{ id: templateId, owner: clientId },
216+
pdfData
217+
);
218+
219+
expect(pdf.parse).toHaveBeenCalled();
220+
221+
expect(mocks.validateLetterTemplateFiles).toHaveBeenCalledWith(
222+
pdf,
223+
undefined
224+
);
225+
226+
expect(
227+
mocks.templateRepository.setLetterValidationResult
228+
).toHaveBeenCalledWith(
229+
{ id: templateId, owner: `CLIENT#${clientId}` },
230+
versionId,
231+
true,
232+
pdf.personalisationParameters,
233+
[],
234+
false
235+
);
236+
});
237+
151238
test('skips personalisation field validation for RTL languages', async () => {
152239
// arrange
153240
const { handler, mocks } = setup();

lambdas/backend-api/src/__tests__/templates/infra/template-repository.test.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ describe('templateRepository', () => {
179179
[templatesTableName]: [
180180
{
181181
id: 'abc-def-ghi-jkl-123',
182-
owner: 'real-owner',
182+
owner: 'userid',
183183
templateStatus: 'DELETED',
184184
},
185185
],
@@ -188,7 +188,7 @@ describe('templateRepository', () => {
188188
});
189189

190190
const response = await templateRepository.get('abc-def-ghi-jkl-123', {
191-
userId: 'real-owner',
191+
userId: 'userid',
192192
clientId: undefined,
193193
});
194194

@@ -205,7 +205,7 @@ describe('templateRepository', () => {
205205
.rejects(new Error('InternalServerError'));
206206

207207
const response = await templateRepository.get('abc-def-ghi-jkl-123', {
208-
userId: 'real-owner',
208+
userId: 'userid',
209209
clientId: undefined,
210210
});
211211

@@ -230,15 +230,15 @@ describe('templateRepository', () => {
230230
Keys: [
231231
{
232232
id: 'abc-def-ghi-jkl-123',
233-
owner: 'real-owner',
233+
owner: 'userid',
234234
},
235235
],
236236
},
237237
},
238238
});
239239

240240
const response = await templateRepository.get('abc-def-ghi-jkl-123', {
241-
userId: 'real-owner',
241+
userId: 'userid',
242242
clientId: undefined,
243243
});
244244

@@ -328,7 +328,7 @@ describe('templateRepository', () => {
328328
mocks.ddbDocClient.on(QueryCommand).resolves({ Items: undefined });
329329

330330
const response = await templateRepository.list({
331-
userId: 'real-owner',
331+
userId: 'userid',
332332
clientId: undefined,
333333
});
334334

@@ -343,7 +343,7 @@ describe('templateRepository', () => {
343343
.rejects(new Error('InternalServerError'));
344344

345345
const response = await templateRepository.list({
346-
userId: 'real-owner',
346+
userId: 'userid',
347347
clientId: undefined,
348348
});
349349

@@ -360,7 +360,8 @@ describe('templateRepository', () => {
360360
const { templateRepository, mocks } = setup();
361361

362362
const clientOwnedTemplate = {
363-
id: 'id',
363+
...letterTemplate,
364+
id: 'client-owned',
364365
owner: 'CLIENT#client',
365366
};
366367

@@ -374,7 +375,7 @@ describe('templateRepository', () => {
374375
});
375376

376377
const response = await templateRepository.list({
377-
userId: 'real-owner',
378+
userId: 'userid',
378379
clientId: 'client',
379380
});
380381

@@ -401,7 +402,7 @@ describe('templateRepository', () => {
401402
},
402403
ExpressionAttributeValues: {
403404
':deletedStatus': 'DELETED',
404-
':owner': 'real-owner',
405+
':owner': 'userid',
405406
},
406407
FilterExpression: '#status <> :deletedStatus',
407408
KeyConditionExpression: '#owner = :owner',

lambdas/backend-api/src/templates/api/validate-letter-template-files.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export class ValidateLetterTemplateFilesLambda {
9898
});
9999
return;
100100
}
101+
101102
if (template.templateStatus !== 'PENDING_VALIDATION') {
102103
log.info('Template is not pending validation - skipping', {
103104
templateStatus: template.templateStatus,
@@ -183,7 +184,7 @@ export class ValidateLetterTemplateFilesLambda {
183184
log.error('File parsing error:', error);
184185

185186
await this.templateRepository.setLetterValidationResult(
186-
{ id: templateId, owner },
187+
{ id: templateId, owner: getTemplateResult.data.owner },
187188
versionId,
188189
false,
189190
[],
@@ -198,7 +199,7 @@ export class ValidateLetterTemplateFilesLambda {
198199
const valid = rtl || validateLetterTemplateFiles(pdf, csv);
199200

200201
await this.templateRepository.setLetterValidationResult(
201-
{ id: templateId, owner },
202+
{ id: templateId, owner: getTemplateResult.data.owner },
202203
versionId,
203204
valid,
204205
pdf.personalisationParameters,

lambdas/backend-api/src/templates/app/template-client.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,6 @@ export class TemplateClient {
521521
private mapDatabaseObjectToDTO(
522522
databaseTemplate: DatabaseTemplate
523523
): TemplateDto | undefined {
524-
const { version: _, ...templateDTO } = databaseTemplate;
525-
526-
return isTemplateDtoValid(templateDTO);
524+
return isTemplateDtoValid(databaseTemplate);
527525
}
528526
}

lambdas/backend-api/src/templates/infra/letter-upload-repository.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ const $LetterUploadMetadata: z.ZodType<LetterUploadMetadata> = z.object({
3535
export class LetterUploadRepository extends LetterFileRepository {
3636
async upload(
3737
templateId: string,
38-
userId: string,
38+
owner: string,
3939
versionId: string,
4040
pdf: File,
4141
csv?: File
4242
): Promise<ApplicationResult<null>> {
43-
const pdfKey = this.key('pdf-template', userId, templateId, versionId);
43+
const pdfKey = this.key('pdf-template', owner, templateId, versionId);
4444

4545
const commands: PutObjectCommand[] = [
4646
new PutObjectCommand({
@@ -49,7 +49,7 @@ export class LetterUploadRepository extends LetterFileRepository {
4949
Body: await pdf.bytes(),
5050
ChecksumAlgorithm: 'SHA256',
5151
Metadata: LetterUploadRepository.metadata(
52-
userId,
52+
owner,
5353
templateId,
5454
versionId,
5555
'pdf-template'
@@ -58,7 +58,7 @@ export class LetterUploadRepository extends LetterFileRepository {
5858
];
5959

6060
if (csv) {
61-
const csvKey = this.key('test-data', userId, templateId, versionId);
61+
const csvKey = this.key('test-data', owner, templateId, versionId);
6262

6363
commands.push(
6464
new PutObjectCommand({
@@ -67,7 +67,7 @@ export class LetterUploadRepository extends LetterFileRepository {
6767
Body: await csv.bytes(),
6868
ChecksumAlgorithm: 'SHA256',
6969
Metadata: LetterUploadRepository.metadata(
70-
userId,
70+
owner,
7171
templateId,
7272
versionId,
7373
'test-data'

lambdas/backend-client/src/schemas/template-schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export const $LetterProperties = schemaFor<LetterProperties>()(
9999
$CreateLetterProperties.extend({
100100
files: $LetterFiles,
101101
/* eslint-disable sonarjs/todo-tag */
102-
// TODO: CCM-10432 - not needed after client migration
102+
// TODO: CCM-10432 - remove, not needed after client migration
103103
owner: z.string().optional(),
104104
personalisationParameters: z.array(z.string()).optional(),
105105
})

tests/test-team/template-mgmt-api-tests/create-letter-template.api.spec.ts

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,6 @@ test.describe('POST /v1/letter-template', () => {
8484
template: {
8585
campaignId: testClients[user1.clientKey]?.campaignId,
8686
createdAt: expect.stringMatching(isoDateRegExp),
87-
id: expect.stringMatching(uuidRegExp),
88-
name: templateData.name,
89-
language: 'en',
90-
letterType: 'x0',
91-
templateStatus: 'PENDING_VALIDATION',
92-
templateType: templateData.templateType,
93-
updatedAt: expect.stringMatching(isoDateRegExp),
9487
files: {
9588
pdfTemplate: {
9689
currentVersion: expect.stringMatching(uuidRegExp),
@@ -104,6 +97,14 @@ test.describe('POST /v1/letter-template', () => {
10497
},
10598
proofs: {},
10699
},
100+
id: expect.stringMatching(uuidRegExp),
101+
language: 'en',
102+
letterType: 'x0',
103+
name: templateData.name,
104+
owner: user1.userId,
105+
templateStatus: 'PENDING_VALIDATION',
106+
templateType: templateData.templateType,
107+
updatedAt: expect.stringMatching(isoDateRegExp),
107108
},
108109
});
109110

@@ -169,13 +170,6 @@ test.describe('POST /v1/letter-template', () => {
169170
template: {
170171
campaignId: testClients[user1.clientKey]?.campaignId,
171172
createdAt: expect.stringMatching(isoDateRegExp),
172-
id: expect.stringMatching(uuidRegExp),
173-
name: templateData.name,
174-
language: 'en',
175-
letterType: 'x0',
176-
templateStatus: 'PENDING_VALIDATION',
177-
templateType: templateData.templateType,
178-
updatedAt: expect.stringMatching(isoDateRegExp),
179173
files: {
180174
pdfTemplate: {
181175
currentVersion: expect.stringMatching(uuidRegExp),
@@ -184,6 +178,14 @@ test.describe('POST /v1/letter-template', () => {
184178
},
185179
proofs: {},
186180
},
181+
id: expect.stringMatching(uuidRegExp),
182+
language: 'en',
183+
letterType: 'x0',
184+
name: templateData.name,
185+
owner: user1.userId,
186+
templateStatus: 'PENDING_VALIDATION',
187+
templateType: templateData.templateType,
188+
updatedAt: expect.stringMatching(isoDateRegExp),
187189
},
188190
});
189191

@@ -237,20 +239,13 @@ test.describe('POST /v1/letter-template', () => {
237239

238240
templateStorageHelper.addAdHocTemplateKey({
239241
id: result.template.id,
240-
owner: user1.userId,
242+
owner: user6.userId,
241243
});
242244

243245
expect(result).toEqual({
244246
statusCode: 201,
245247
template: {
246248
createdAt: expect.stringMatching(isoDateRegExp),
247-
id: expect.stringMatching(uuidRegExp),
248-
name: templateData.name,
249-
language: 'en',
250-
letterType: 'x0',
251-
templateStatus: 'PENDING_VALIDATION',
252-
templateType: templateData.templateType,
253-
updatedAt: expect.stringMatching(isoDateRegExp),
254249
files: {
255250
pdfTemplate: {
256251
currentVersion: expect.stringMatching(uuidRegExp),
@@ -259,6 +254,14 @@ test.describe('POST /v1/letter-template', () => {
259254
},
260255
proofs: {},
261256
},
257+
id: expect.stringMatching(uuidRegExp),
258+
language: 'en',
259+
letterType: 'x0',
260+
name: templateData.name,
261+
owner: user6.userId,
262+
templateStatus: 'PENDING_VALIDATION',
263+
templateType: templateData.templateType,
264+
updatedAt: expect.stringMatching(isoDateRegExp),
262265
},
263266
});
264267

0 commit comments

Comments
 (0)