Skip to content

Commit b1047e9

Browse files
committed
CCM-12327: api tests
1 parent ec79665 commit b1047e9

File tree

8 files changed

+373
-37
lines changed

8 files changed

+373
-37
lines changed

tests/test-team/helpers/use-cases/simulate-failed-virus-scan.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class SimulateFailedVirusScan implements IUseCase<Template> {
2929
owner: `CLIENT#${this.#config.clientId}`,
3030
id: this.#config.templateId,
3131
},
32-
UpdateExpression: `ADD #lockNumber :lockNumberIncrement, SET ${this.#config.filePath} = :virusScanStatus, templateStatus = :virusScanStatusFailedTemplateStatus`,
32+
UpdateExpression: `ADD #lockNumber :lockNumberIncrement SET ${this.#config.filePath} = :virusScanStatus, templateStatus = :virusScanStatusFailedTemplateStatus`,
3333
ExpressionAttributeNames: {
3434
'#lockNumber': 'lockNumber',
3535
},

tests/test-team/helpers/use-cases/simulate-passed-validation.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@ export class SimulatePassedValidation implements IUseCase<Template> {
2828

2929
id: this.#config.templateId,
3030
},
31-
UpdateExpression: [
32-
'ADD #lockNumber :lockNumberIncrement',
31+
UpdateExpression: `ADD #lockNumber :lockNumberIncrement ${[
3332
'SET files.pdfTemplate.virusScanStatus = :virusScanStatus',
3433
'templateStatus = :readyForSubmissionStatus',
3534
'files.proofs = :proofs',
3635
...(this.#config.hasTestData
3736
? ['files.testDataCsv.virusScanStatus = :virusScanStatus']
3837
: []),
39-
].join(', '),
38+
].join(', ')}`,
4039
ExpressionAttributeNames: {
4140
'#lockNumber': 'lockNumber',
4241
},

tests/test-team/template-mgmt-api-tests/delete-template.api.spec.ts

Lines changed: 117 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ test.describe('DELETE /v1/template/:templateId', () => {
3333

3434
test('returns 401 if no auth token', async ({ request }) => {
3535
const response = await request.delete(
36-
`${process.env.API_BASE_URL}/v1/template/some-template`
36+
`${process.env.API_BASE_URL}/v1/template/some-template`,
37+
{
38+
headers: {
39+
'X-Lock-Number': '1',
40+
},
41+
}
3742
);
3843
expect(response.status()).toBe(401);
3944
expect(await response.json()).toEqual({
@@ -47,6 +52,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
4752
{
4853
headers: {
4954
Authorization: await user1.getAccessToken(),
55+
'X-Lock-Number': '1',
5056
},
5157
}
5258
);
@@ -84,6 +90,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
8490
{
8591
headers: {
8692
Authorization: await user2.getAccessToken(),
93+
'X-Lock-Number': String(created.data.lockNumber),
8794
},
8895
}
8996
);
@@ -152,6 +159,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
152159
{
153160
headers: {
154161
Authorization: await user1.getAccessToken(),
162+
'X-Lock-Number': String(createResult.data.lockNumber),
155163
},
156164
}
157165
);
@@ -212,7 +220,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
212220

213221
expect(response.status(), debug).toBe(201);
214222

215-
await orchestrator.send(
223+
const latest = await orchestrator.send(
216224
new SimulatePassedValidation({
217225
templateId: createResult.data.id,
218226
clientId: user1.clientId,
@@ -225,6 +233,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
225233
{
226234
headers: {
227235
Authorization: await user1.getAccessToken(),
236+
'X-Lock-Number': String(latest.lockNumber),
228237
},
229238
}
230239
);
@@ -241,6 +250,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
241250
{
242251
headers: {
243252
Authorization: await user1.getAccessToken(),
253+
'X-Lock-Number': String(submitResult.data.lockNumber),
244254
},
245255
}
246256
);
@@ -313,6 +323,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
313323
{
314324
headers: {
315325
Authorization: await user1.getAccessToken(),
326+
'X-Lock-Number': String(createResult.data.lockNumber),
316327
},
317328
}
318329
);
@@ -324,6 +335,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
324335
{
325336
headers: {
326337
Authorization: await user1.getAccessToken(),
338+
'X-Lock-Number': String(createResult.data.lockNumber + 1),
327339
},
328340
}
329341
);
@@ -365,6 +377,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
365377
{
366378
headers: {
367379
Authorization: await user1.getAccessToken(),
380+
'X-Lock-Number': String(created.data.lockNumber),
368381
},
369382
}
370383
);
@@ -399,17 +412,20 @@ test.describe('DELETE /v1/template/:templateId', () => {
399412
{
400413
headers: {
401414
Authorization: await user1.getAccessToken(),
415+
'X-Lock-Number': String(created.data.lockNumber),
402416
},
403417
}
404418
);
405419

406420
expect(submitResponse.status()).toBe(200);
421+
const submitted = await submitResponse.json();
407422

408423
const deleteResponse = await request.delete(
409424
`${process.env.API_BASE_URL}/v1/template/${created.data.id}`,
410425
{
411426
headers: {
412427
Authorization: await user1.getAccessToken(),
428+
'X-Lock-Number': String(submitted.data.lockNumber),
413429
},
414430
}
415431
);
@@ -451,6 +467,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
451467
{
452468
headers: {
453469
Authorization: await user1.getAccessToken(),
470+
'X-Lock-Number': String(created.data.lockNumber),
454471
},
455472
}
456473
);
@@ -462,6 +479,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
462479
{
463480
headers: {
464481
Authorization: await user1.getAccessToken(),
482+
'X-Lock-Number': String(created.data.lockNumber + 1),
465483
},
466484
}
467485
);
@@ -503,6 +521,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
503521
{
504522
headers: {
505523
Authorization: await user1.getAccessToken(),
524+
'X-Lock-Number': String(created.data.lockNumber),
506525
},
507526
}
508527
);
@@ -537,17 +556,20 @@ test.describe('DELETE /v1/template/:templateId', () => {
537556
{
538557
headers: {
539558
Authorization: await user1.getAccessToken(),
559+
'X-Lock-Number': String(created.data.lockNumber),
540560
},
541561
}
542562
);
543563

544564
expect(submitResponse.status()).toBe(200);
565+
const submitted = await submitResponse.json();
545566

546567
const deleteResponse = await request.delete(
547568
`${process.env.API_BASE_URL}/v1/template/${created.data.id}`,
548569
{
549570
headers: {
550571
Authorization: await user1.getAccessToken(),
572+
'X-Lock-Number': String(submitted.data.lockNumber),
551573
},
552574
}
553575
);
@@ -589,6 +611,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
589611
{
590612
headers: {
591613
Authorization: await user1.getAccessToken(),
614+
'X-Lock-Number': String(created.data.lockNumber),
592615
},
593616
}
594617
);
@@ -600,6 +623,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
600623
{
601624
headers: {
602625
Authorization: await user1.getAccessToken(),
626+
'X-Lock-Number': String(created.data.lockNumber + 1),
603627
},
604628
}
605629
);
@@ -641,6 +665,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
641665
{
642666
headers: {
643667
Authorization: await user1.getAccessToken(),
668+
'X-Lock-Number': String(created.data.lockNumber),
644669
},
645670
}
646671
);
@@ -675,17 +700,21 @@ test.describe('DELETE /v1/template/:templateId', () => {
675700
{
676701
headers: {
677702
Authorization: await user1.getAccessToken(),
703+
'X-Lock-Number': String(created.data.lockNumber),
678704
},
679705
}
680706
);
681707

682708
expect(submitResponse.status()).toBe(200);
683709

710+
const submitted = await submitResponse.json();
711+
684712
const deleteResponse = await request.delete(
685713
`${process.env.API_BASE_URL}/v1/template/${created.data.id}`,
686714
{
687715
headers: {
688716
Authorization: await user1.getAccessToken(),
717+
'X-Lock-Number': String(submitted.data.lockNumber),
689718
},
690719
}
691720
);
@@ -727,6 +756,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
727756
{
728757
headers: {
729758
Authorization: await user1.getAccessToken(),
759+
'X-Lock-Number': String(created.data.lockNumber),
730760
},
731761
}
732762
);
@@ -738,6 +768,7 @@ test.describe('DELETE /v1/template/:templateId', () => {
738768
{
739769
headers: {
740770
Authorization: await user1.getAccessToken(),
771+
'X-Lock-Number': String(created.data.lockNumber + 1),
741772
},
742773
}
743774
);
@@ -781,17 +812,95 @@ test.describe('DELETE /v1/template/:templateId', () => {
781812
{
782813
headers: {
783814
Authorization: await userSharedClient.getAccessToken(),
815+
'X-Lock-Number': String(created.data.lockNumber),
784816
},
785817
}
786818
);
787819

788820
expect(deleteResponse.status()).toBe(204);
789821
});
790822
});
791-
});
792823

793-
/**
794-
* TODO: CCM-12327
795-
* - tests for missing / invalid lock number header
796-
* - add in these headers to valid tests
797-
*/
824+
test('returns 409 if the lock number header is not set', async ({
825+
request,
826+
}) => {
827+
const createResponse = await request.post(
828+
`${process.env.API_BASE_URL}/v1/template`,
829+
{
830+
headers: {
831+
Authorization: await user1.getAccessToken(),
832+
},
833+
data: TemplateAPIPayloadFactory.getCreateTemplatePayload({
834+
templateType: 'EMAIL',
835+
}),
836+
}
837+
);
838+
839+
expect(createResponse.status()).toBe(201);
840+
const created = await createResponse.json();
841+
templateStorageHelper.addAdHocTemplateKey({
842+
templateId: created.data.id,
843+
clientId: user1.clientId,
844+
});
845+
846+
const deleteResponse = await request.delete(
847+
`${process.env.API_BASE_URL}/v1/template/${created.data.id}`,
848+
{
849+
headers: {
850+
Authorization: await user1.getAccessToken(),
851+
},
852+
}
853+
);
854+
855+
expect(deleteResponse.status()).toBe(409);
856+
857+
const body = await deleteResponse.json();
858+
859+
expect(body).toEqual({
860+
statusCode: 409,
861+
technicalMessage: 'Invalid lock number',
862+
});
863+
});
864+
865+
test('returns 409 if the lock number header does not match the current one', async ({
866+
request,
867+
}) => {
868+
const createResponse = await request.post(
869+
`${process.env.API_BASE_URL}/v1/template`,
870+
{
871+
headers: {
872+
Authorization: await user1.getAccessToken(),
873+
},
874+
data: TemplateAPIPayloadFactory.getCreateTemplatePayload({
875+
templateType: 'EMAIL',
876+
}),
877+
}
878+
);
879+
880+
expect(createResponse.status()).toBe(201);
881+
const created = await createResponse.json();
882+
templateStorageHelper.addAdHocTemplateKey({
883+
templateId: created.data.id,
884+
clientId: user1.clientId,
885+
});
886+
887+
const deleteResponse = await request.delete(
888+
`${process.env.API_BASE_URL}/v1/template/${created.data.id}`,
889+
{
890+
headers: {
891+
Authorization: await user1.getAccessToken(),
892+
'X-Lock-Number': String(created.data.lockNumber + 1),
893+
},
894+
}
895+
);
896+
897+
expect(deleteResponse.status()).toBe(409);
898+
899+
const body = await deleteResponse.json();
900+
901+
expect(body).toEqual({
902+
statusCode: 409,
903+
technicalMessage: 'Invalid lock number',
904+
});
905+
});
906+
});

tests/test-team/template-mgmt-api-tests/get-template.api.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ test.describe('GET /v1/template/:templateId', () => {
172172
{
173173
headers: {
174174
Authorization: await user1.getAccessToken(),
175+
'X-Lock-Number': String(created.data.lockNumber),
175176
},
176177
}
177178
);

tests/test-team/template-mgmt-api-tests/list-templates.api.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ test.describe('GET /v1/templates', () => {
178178
{
179179
headers: {
180180
Authorization: await user1.getAccessToken(),
181+
'X-Lock-Number': String(created1.data.lockNumber),
181182
},
182183
}
183184
);

0 commit comments

Comments
 (0)