@@ -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+ } ) ;
0 commit comments