@@ -7,27 +7,34 @@ import {
77 setupDynamoDBContainer ,
88} from "./db" ;
99import { LetterRepository } from "../letter-repository" ;
10- import { Letter } from "../types" ;
10+ import { InsertLetter , Letter , UpdateLetter } from "../types" ;
1111import { LogStream , createTestLogger } from "./logs" ;
12- import { LetterDto } from "../../../../lambdas/api-handler/src/contracts/letters" ;
1312
1413function createLetter (
1514 supplierId : string ,
1615 letterId : string ,
1716 status : Letter [ "status" ] = "PENDING" ,
18- ) : Omit < Letter , "ttl" | "supplierStatus" | "supplierStatusSk" > {
17+ ) : InsertLetter {
18+ const now = new Date ( ) . toISOString ( ) ;
1919 return {
2020 id : letterId ,
2121 supplierId,
2222 specificationId : "specification1" ,
2323 groupId : "group1" ,
2424 url : `s3://bucket/${ letterId } .pdf` ,
2525 status,
26- createdAt : new Date ( ) . toISOString ( ) ,
27- updatedAt : new Date ( ) . toISOString ( ) ,
26+ createdAt : now ,
27+ updatedAt : now ,
28+ source : "/data-plane/letter-rendering/pdf" ,
29+ subject : `client/1/letter-request/${ letterId } ` ,
2830 } ;
2931}
3032
33+ function assertDateBetween ( date : number , before : number , after : number ) {
34+ expect ( date ) . toBeGreaterThanOrEqual ( before ) ;
35+ expect ( date ) . toBeLessThanOrEqual ( after ) ;
36+ }
37+
3138// Database tests can take longer, especially with setup and teardown
3239jest . setTimeout ( 30_000 ) ;
3340
@@ -66,18 +73,46 @@ describe("LetterRepository", () => {
6673 expect ( letter . status ) . toBe ( status ) ;
6774 }
6875
76+ function assertTtl ( ttl : number , before : number , after : number ) {
77+ const expectedLower = Math . floor (
78+ before / 1000 + 60 * 60 * db . config . lettersTtlHours ,
79+ ) ;
80+ const expectedUpper = Math . floor (
81+ after / 1000 + 60 * 60 * db . config . lettersTtlHours ,
82+ ) ;
83+ expect ( ttl ) . toBeGreaterThanOrEqual ( expectedLower ) ;
84+ expect ( ttl ) . toBeLessThanOrEqual ( expectedUpper ) ;
85+ }
86+
6987 test ( "adds a letter to the database" , async ( ) => {
7088 const supplierId = "supplier1" ;
7189 const letterId = "letter1" ;
7290
91+ const before = Date . now ( ) ;
92+
7393 await letterRepository . putLetter ( createLetter ( supplierId , letterId ) ) ;
7494
95+ const after = Date . now ( ) ;
96+
7597 const letter = await letterRepository . getLetterById ( supplierId , letterId ) ;
7698 expect ( letter ) . toBeDefined ( ) ;
7799 expect ( letter . id ) . toBe ( letterId ) ;
78100 expect ( letter . supplierId ) . toBe ( supplierId ) ;
101+ assertDateBetween ( new Date ( letter . createdAt ) . valueOf ( ) , before , after ) ;
102+ assertDateBetween ( new Date ( letter . updatedAt ) . valueOf ( ) , before , after ) ;
103+ assertDateBetween (
104+ new Date ( letter . supplierStatusSk ) . valueOf ( ) ,
105+ before ,
106+ after ,
107+ ) ;
108+ expect ( letter . supplierStatus ) . toBe ( "supplier1#PENDING" ) ;
109+ expect ( letter . url ) . toBe ( "s3://bucket/letter1.pdf" ) ;
110+ expect ( letter . specificationId ) . toBe ( "specification1" ) ;
111+ expect ( letter . groupId ) . toBe ( "group1" ) ;
79112 expect ( letter . reasonCode ) . toBeUndefined ( ) ;
80113 expect ( letter . reasonText ) . toBeUndefined ( ) ;
114+ expect ( letter . subject ) . toBe ( `client/1/letter-request/${ letterId } ` ) ;
115+ assertTtl ( letter . ttl , before , after ) ;
81116 } ) ;
82117
83118 test ( "fetches a letter by id" , async ( ) => {
@@ -90,6 +125,9 @@ describe("LetterRepository", () => {
90125 specificationId : "specification1" ,
91126 groupId : "group1" ,
92127 status : "PENDING" ,
128+ url : "s3://bucket/letter1.pdf" ,
129+ source : "/data-plane/letter-rendering/pdf" ,
130+ subject : "client/1/letter-request/letter1" ,
93131 } ) ,
94132 ) ;
95133 } ) ;
@@ -122,18 +160,18 @@ describe("LetterRepository", () => {
122160 } ) ;
123161
124162 test ( "updates a letter's status in the database" , async ( ) => {
125- const letter = createLetter ( "supplier1" , "letter1" , "PENDING" ) ;
163+ const letter = createLetter ( "supplier1" , "letter1" ) ;
126164 await letterRepository . putLetter ( letter ) ;
127165 await checkLetterStatus ( "supplier1" , "letter1" , "PENDING" ) ;
128166
129- const letterDto : LetterDto = {
167+ const updateLetter : UpdateLetter = {
130168 id : "letter1" ,
131169 supplierId : "supplier1" ,
132170 status : "REJECTED" ,
133171 reasonCode : "R01" ,
134172 reasonText : "Reason text" ,
135173 } ;
136- await letterRepository . updateLetterStatus ( letterDto ) ;
174+ await letterRepository . updateLetterStatus ( updateLetter ) ;
137175
138176 const updatedLetter = await letterRepository . getLetterById (
139177 "supplier1" ,
@@ -147,9 +185,7 @@ describe("LetterRepository", () => {
147185 test ( "updates a letter's updatedAt date" , async ( ) => {
148186 jest . useFakeTimers ( ) ;
149187 jest . setSystemTime ( new Date ( 2020 , 1 , 1 ) ) ;
150- await letterRepository . putLetter (
151- createLetter ( "supplier1" , "letter1" , "PENDING" ) ,
152- ) ;
188+ await letterRepository . putLetter ( createLetter ( "supplier1" , "letter1" ) ) ;
153189 const originalLetter = await letterRepository . getLetterById (
154190 "supplier1" ,
155191 "letter1" ,
@@ -159,7 +195,7 @@ describe("LetterRepository", () => {
159195 // Month is zero-indexed in JavaScript Date
160196 // Day is one-indexed
161197 jest . setSystemTime ( new Date ( 2020 , 1 , 2 ) ) ;
162- const letterDto : LetterDto = {
198+ const letterDto : UpdateLetter = {
163199 id : "letter1" ,
164200 supplierId : "supplier1" ,
165201 status : "DELIVERED" ,
@@ -175,13 +211,13 @@ describe("LetterRepository", () => {
175211 } ) ;
176212
177213 test ( "can't update a letter that does not exist" , async ( ) => {
178- const letterDto : LetterDto = {
214+ const updateLetter : UpdateLetter = {
179215 id : "letter1" ,
180216 supplierId : "supplier1" ,
181217 status : "DELIVERED" ,
182218 } ;
183219 await expect (
184- letterRepository . updateLetterStatus ( letterDto ) ,
220+ letterRepository . updateLetterStatus ( updateLetter ) ,
185221 ) . rejects . toThrow (
186222 "Letter with id letter1 not found for supplier supplier1" ,
187223 ) ;
@@ -193,13 +229,13 @@ describe("LetterRepository", () => {
193229 lettersTableName : "nonexistent-table" ,
194230 } ) ;
195231
196- const letterDto : LetterDto = {
232+ const updateLetter : UpdateLetter = {
197233 id : "letter1" ,
198234 supplierId : "supplier1" ,
199235 status : "DELIVERED" ,
200236 } ;
201237 await expect (
202- misconfiguredRepository . updateLetterStatus ( letterDto ) ,
238+ misconfiguredRepository . updateLetterStatus ( updateLetter ) ,
203239 ) . rejects . toThrow ( "Cannot do operations on a non-existent table" ) ;
204240 } ) ;
205241
@@ -238,12 +274,12 @@ describe("LetterRepository", () => {
238274 ) ;
239275 expect ( pendingLetters . letters ) . toHaveLength ( 2 ) ;
240276
241- const letterDto : LetterDto = {
277+ const updateLetter : UpdateLetter = {
242278 id : "letter1" ,
243279 supplierId : "supplier1" ,
244280 status : "DELIVERED" ,
245281 } ;
246- await letterRepository . updateLetterStatus ( letterDto ) ;
282+ await letterRepository . updateLetterStatus ( updateLetter ) ;
247283 const remainingLetters = await letterRepository . getLettersByStatus (
248284 "supplier1" ,
249285 "PENDING" ,
@@ -313,7 +349,7 @@ describe("LetterRepository", () => {
313349 url : "s3://bucket/invalid-letter.pdf" ,
314350 status : "PENDING" ,
315351 supplierStatus : "supplier1#PENDING" ,
316- supplierStatusSk : Date . now ( ) . toString ( ) ,
352+ supplierStatusSk : new Date ( ) . toISOString ( ) ,
317353 createdAt : new Date ( ) . toISOString ( ) ,
318354 updatedAt : new Date ( ) . toISOString ( ) ,
319355 } ,
@@ -405,15 +441,36 @@ describe("LetterRepository", () => {
405441 } ) ;
406442
407443 test ( "should batch write letters to the database" , async ( ) => {
408- const letters = [
444+ const before = Date . now ( ) ;
445+
446+ await letterRepository . putLetterBatch ( [
409447 createLetter ( "supplier1" , "letter1" ) ,
410448 createLetter ( "supplier1" , "letter2" ) ,
411449 createLetter ( "supplier1" , "letter3" ) ,
412- ] ;
450+ ] ) ;
413451
414- await letterRepository . putLetterBatch ( letters ) ;
452+ const after = Date . now ( ) ;
453+
454+ const letter = await letterRepository . getLetterById ( "supplier1" , "letter1" ) ;
455+ expect ( letter ) . toBeDefined ( ) ;
456+ expect ( letter . id ) . toBe ( "letter1" ) ;
457+ expect ( letter . supplierId ) . toBe ( "supplier1" ) ;
458+ assertDateBetween ( new Date ( letter . createdAt ) . valueOf ( ) , before , after ) ;
459+ assertDateBetween ( new Date ( letter . updatedAt ) . valueOf ( ) , before , after ) ;
460+ assertDateBetween (
461+ new Date ( letter . supplierStatusSk ) . valueOf ( ) ,
462+ before ,
463+ after ,
464+ ) ;
465+ expect ( letter . supplierStatus ) . toBe ( "supplier1#PENDING" ) ;
466+ expect ( letter . url ) . toBe ( "s3://bucket/letter1.pdf" ) ;
467+ expect ( letter . specificationId ) . toBe ( "specification1" ) ;
468+ expect ( letter . groupId ) . toBe ( "group1" ) ;
469+ expect ( letter . reasonCode ) . toBeUndefined ( ) ;
470+ expect ( letter . reasonText ) . toBeUndefined ( ) ;
471+ expect ( letter . subject ) . toBe ( "client/1/letter-request/letter1" ) ;
472+ assertTtl ( letter . ttl , before , after ) ;
415473
416- await checkLetterStatus ( "supplier1" , "letter1" , "PENDING" ) ;
417474 await checkLetterStatus ( "supplier1" , "letter2" , "PENDING" ) ;
418475 await checkLetterStatus ( "supplier1" , "letter3" , "PENDING" ) ;
419476 } ) ;
0 commit comments