@@ -27,7 +27,12 @@ test.describe('POST /v1/template/:templateId/proof', () => {
2727
2828 test ( 'returns 401 if no auth token' , async ( { request } ) => {
2929 const response = await request . post (
30- `${ process . env . API_BASE_URL } /v1/template/some-template/proof`
30+ `${ process . env . API_BASE_URL } /v1/template/some-template/proof` ,
31+ {
32+ headers : {
33+ 'X-Lock-Number' : '0' ,
34+ } ,
35+ }
3136 ) ;
3237
3338 const result = await response . json ( ) ;
@@ -45,6 +50,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
4550 {
4651 headers : {
4752 Authorization : await userProofingEnabled . getAccessToken ( ) ,
53+ 'X-Lock-Number' : '0' ,
4854 } ,
4955 }
5056 ) ;
@@ -60,22 +66,21 @@ test.describe('POST /v1/template/:templateId/proof', () => {
6066 test ( 'returns 404 if template exists but is owned by a different client' , async ( {
6167 request,
6268 } ) => {
63- const userProofingEnabledtemplateId = randomUUID ( ) ;
69+ const template = TemplateFactory . uploadLetterTemplate (
70+ randomUUID ( ) ,
71+ userProofingEnabled ,
72+ 'userProofingEnabledtemplate' ,
73+ 'PENDING_PROOF_REQUEST'
74+ ) ;
6475
65- await templateStorageHelper . seedTemplateData ( [
66- TemplateFactory . uploadLetterTemplate (
67- userProofingEnabledtemplateId ,
68- userProofingEnabled ,
69- 'userProofingEnabledtemplate' ,
70- 'PENDING_PROOF_REQUEST'
71- ) ,
72- ] ) ;
76+ await templateStorageHelper . seedTemplateData ( [ template ] ) ;
7377
7478 const updateResponse = await request . post (
75- `${ process . env . API_BASE_URL } /v1/template/${ userProofingEnabledtemplateId } /proof` ,
79+ `${ process . env . API_BASE_URL } /v1/template/${ template . id } /proof` ,
7680 {
7781 headers : {
7882 Authorization : await differentClientUser . getAccessToken ( ) ,
83+ 'X-Lock-Number' : String ( template . lockNumber ) ,
7984 } ,
8085 }
8186 ) ;
@@ -126,6 +131,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
126131 {
127132 headers : {
128133 Authorization : await userProofingEnabled . getAccessToken ( ) ,
134+ 'X-Lock-Number' : String ( template . lockNumber ) ,
129135 } ,
130136 }
131137 ) ;
@@ -141,6 +147,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
141147 name : template . name ,
142148 templateStatus : 'WAITING_FOR_PROOF' ,
143149 templateType : template . templateType ,
150+ lockNumber : template . lockNumber + 1 ,
144151 } ) ,
145152 } ) ;
146153
@@ -176,6 +183,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
176183 {
177184 headers : {
178185 Authorization : await userProofingEnabled . getAccessToken ( ) ,
186+ 'X-Lock-Number' : String ( template . lockNumber ) ,
179187 } ,
180188 }
181189 ) ;
@@ -209,6 +217,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
209217 {
210218 headers : {
211219 Authorization : await userProofingEnabled . getAccessToken ( ) ,
220+ 'X-Lock-Number' : String ( template . lockNumber ) ,
212221 } ,
213222 }
214223 ) ;
@@ -257,6 +266,7 @@ test.describe('POST /v1/template/:templateId/proof', () => {
257266 {
258267 headers : {
259268 Authorization : await userProofingEnabled . getAccessToken ( ) ,
269+ 'X-Lock-Number' : String ( template . lockNumber ) ,
260270 } ,
261271 }
262272 ) ;
@@ -277,4 +287,101 @@ test.describe('POST /v1/template/:templateId/proof', () => {
277287
278288 expect ( result . data . updatedAt ) . toBeDateRoughlyBetween ( [ start , new Date ( ) ] ) ;
279289 } ) ;
290+
291+ test ( 'returns 400 if the lock number header is not set' , async ( {
292+ request,
293+ } ) => {
294+ const template = {
295+ ...TemplateFactory . uploadLetterTemplate (
296+ randomUUID ( ) ,
297+ userProofingEnabled ,
298+ 'userProofingEnabledtemplate' ,
299+ 'PENDING_PROOF_REQUEST'
300+ ) ,
301+ files : {
302+ pdfTemplate : {
303+ virusScanStatus : 'PASSED' ,
304+ currentVersion : randomUUID ( ) ,
305+ fileName : 'template.pdf' ,
306+ } ,
307+ testDataCsv : {
308+ virusScanStatus : 'PASSED' ,
309+ currentVersion : randomUUID ( ) ,
310+ fileName : 'data.csv' ,
311+ } ,
312+ } ,
313+ personalisationParameters : [ 'nhsNumber' ] ,
314+ campaignId : userProofingEnabled . campaignIds ?. [ 0 ] ,
315+ } ;
316+
317+ await templateStorageHelper . seedTemplateData ( [ template ] ) ;
318+
319+ const response = await request . post (
320+ `${ process . env . API_BASE_URL } /v1/template/${ template . id } /proof` ,
321+ {
322+ headers : {
323+ Authorization : await userProofingEnabled . getAccessToken ( ) ,
324+ } ,
325+ }
326+ ) ;
327+
328+ const result = await response . json ( ) ;
329+ const debug = JSON . stringify ( result , null , 2 ) ;
330+
331+ expect ( response . status ( ) , debug ) . toBe ( 400 ) ;
332+
333+ expect ( result ) . toEqual ( {
334+ statusCode : 400 ,
335+ technicalMessage : 'Invalid lock number' ,
336+ } ) ;
337+ } ) ;
338+
339+ test ( 'returns 400 if the lock number header does not match the current one' , async ( {
340+ request,
341+ } ) => {
342+ const template = {
343+ ...TemplateFactory . uploadLetterTemplate (
344+ randomUUID ( ) ,
345+ userProofingEnabled ,
346+ 'userProofingEnabledtemplate' ,
347+ 'PENDING_PROOF_REQUEST'
348+ ) ,
349+ files : {
350+ pdfTemplate : {
351+ virusScanStatus : 'PASSED' ,
352+ currentVersion : randomUUID ( ) ,
353+ fileName : 'template.pdf' ,
354+ } ,
355+ testDataCsv : {
356+ virusScanStatus : 'PASSED' ,
357+ currentVersion : randomUUID ( ) ,
358+ fileName : 'data.csv' ,
359+ } ,
360+ } ,
361+ personalisationParameters : [ 'nhsNumber' ] ,
362+ campaignId : userProofingEnabled . campaignIds ?. [ 0 ] ,
363+ } ;
364+
365+ await templateStorageHelper . seedTemplateData ( [ template ] ) ;
366+
367+ const response = await request . post (
368+ `${ process . env . API_BASE_URL } /v1/template/${ template . id } /proof` ,
369+ {
370+ headers : {
371+ Authorization : await userProofingEnabled . getAccessToken ( ) ,
372+ 'X-Lock-Number' : String ( template . lockNumber + 1 ) ,
373+ } ,
374+ }
375+ ) ;
376+
377+ const result = await response . json ( ) ;
378+ const debug = JSON . stringify ( result , null , 2 ) ;
379+
380+ expect ( response . status ( ) , debug ) . toBe ( 400 ) ;
381+
382+ expect ( result ) . toEqual ( {
383+ statusCode : 400 ,
384+ technicalMessage : 'Invalid lock number' ,
385+ } ) ;
386+ } ) ;
280387} ) ;
0 commit comments