@@ -26,8 +26,9 @@ describe('Cache sheet data', () => {
2626 >
2727 > ;
2828 } > ;
29+ let db : libsqlClient . Client ;
2930 beforeEach ( async ( ) => {
30- const db = libsqlClient . createClient ( { url : ':memory:' } ) ;
31+ db = libsqlClient . createClient ( { url : ':memory:' } ) ;
3132 await ensureCachedSheetDataTableExists ( db ) ( ) ;
3233 getRightOrFail (
3334 await cacheSheetData ( db ) ( cacheTimestamp , sheetId , [
@@ -59,5 +60,117 @@ describe('Cache sheet data', () => {
5960 expect ( cachedData [ 0 ] . sheet_id ) . toStrictEqual ( sheetId ) ;
6061 expect ( cachedData [ 0 ] . cached_at ) . toStrictEqual ( cacheTimestamp ) ;
6162 } ) ;
63+
64+ describe ( 'Overwrite cache then restore' , ( ) => {
65+ const newCacheTimestamp = new Date ( 2024 , 1 , 23 , 5 , 23 , 45 ) ;
66+ let cachedDataAfter : ReadonlyArray < {
67+ cached_at : Date ;
68+ sheet_id : string ;
69+ cached_data : t . Validation <
70+ ReadonlyArray <
71+ | EventOfType < 'EquipmentTrainingQuizResult' >
72+ | EventOfType < 'EquipmentTrainingQuizSync' >
73+ >
74+ > ;
75+ } > ;
76+ beforeEach ( async ( ) => {
77+ getRightOrFail (
78+ await cacheSheetData ( db ) ( newCacheTimestamp , sheetId , [
79+ constructEvent ( 'EquipmentTrainingQuizSync' ) ( {
80+ equipmentId,
81+ } ) ,
82+ constructEvent ( 'EquipmentTrainingQuizResult' ) ( {
83+ equipmentId : equipmentId ,
84+ trainingSheetId : sheetId ,
85+ memberNumberProvided : faker . number . int ( ) ,
86+ emailProvided : 'beans@bob.co.uk' ,
87+ score : 23 ,
88+ id : '1a3eeb99-dd7a-4f55-a018-6f5e2678fc14' as UUID ,
89+ maxScore : 23 ,
90+ percentage : 100 ,
91+ timestampEpochMS : 1738623209 ,
92+ } ) ,
93+ constructEvent ( 'EquipmentTrainingQuizResult' ) ( {
94+ equipmentId : equipmentId ,
95+ trainingSheetId : sheetId ,
96+ memberNumberProvided : faker . number . int ( ) ,
97+ emailProvided : 'fred@bob.co.uk' ,
98+ score : 17 ,
99+ id : 'bbbbeb99-aa7a-4f55-a018-ffff2678feee' as UUID ,
100+ maxScore : 23 ,
101+ percentage : 74 ,
102+ timestampEpochMS : 1738623333 ,
103+ } ) ,
104+ ] ) ( )
105+ ) ;
106+ cachedDataAfter = getRightOrFail ( await getCachedSheetData ( db ) ( ) ( ) ) ;
107+ } ) ;
108+ it ( 'Each sheet is cached' , ( ) => {
109+ expect ( cachedDataAfter ) . toHaveLength ( 1 ) ; // 1 sheet
110+ } ) ;
111+ it ( 'All events cached are returned' , ( ) => {
112+ expect ( getRightOrFail ( cachedDataAfter [ 0 ] . cached_data ) ) . toHaveLength ( 3 ) ; // 3 events.
113+ } ) ;
114+ it ( 'Event cache is correctly labeled' , ( ) => {
115+ expect ( cachedDataAfter [ 0 ] . sheet_id ) . toStrictEqual ( sheetId ) ;
116+ expect ( cachedDataAfter [ 0 ] . cached_at ) . toStrictEqual ( newCacheTimestamp ) ;
117+ } ) ;
118+ } ) ;
119+ describe ( 'Cache multiple equipment' , ( ) => {
120+ const secondSheetCacheTimestamp = new Date ( 2024 , 1 , 23 , 5 , 23 , 45 ) ;
121+ const secondEquipmentId = 'ed779c68-d165-45b3-bd0f-5590021d5337' as UUID ;
122+ const secondSheetId = 'secondSheetId' ;
123+ let cachedDataAfter : ReadonlyArray < {
124+ cached_at : Date ;
125+ sheet_id : string ;
126+ cached_data : t . Validation <
127+ ReadonlyArray <
128+ | EventOfType < 'EquipmentTrainingQuizResult' >
129+ | EventOfType < 'EquipmentTrainingQuizSync' >
130+ >
131+ > ;
132+ } > ;
133+ let firstSheetData : ( typeof cachedDataAfter ) [ 0 ] ;
134+ let secondSheetData : ( typeof cachedDataAfter ) [ 0 ] ;
135+ beforeEach ( async ( ) => {
136+ getRightOrFail (
137+ await cacheSheetData ( db ) ( secondSheetCacheTimestamp , secondSheetId , [
138+ constructEvent ( 'EquipmentTrainingQuizSync' ) ( {
139+ equipmentId : secondEquipmentId ,
140+ } ) ,
141+ constructEvent ( 'EquipmentTrainingQuizResult' ) ( {
142+ equipmentId : secondEquipmentId ,
143+ trainingSheetId : secondSheetId ,
144+ memberNumberProvided : faker . number . int ( ) ,
145+ emailProvided : 'beans@bob.co.uk' ,
146+ score : 10 ,
147+ id : 'e139bb51-af9b-420d-87cf-53417491fdb4' as UUID ,
148+ maxScore : 10 ,
149+ percentage : 100 ,
150+ timestampEpochMS : 1738627209 ,
151+ } ) ,
152+ ] ) ( )
153+ ) ;
154+ cachedDataAfter = getRightOrFail ( await getCachedSheetData ( db ) ( ) ( ) ) ;
155+ firstSheetData = cachedDataAfter . find (
156+ data => data . sheet_id === sheetId
157+ ) ! ;
158+ secondSheetData = cachedDataAfter . find (
159+ data => data . sheet_id === secondSheetId
160+ ) ! ;
161+ } ) ;
162+ it ( 'Event cache is correctly labeled' , ( ) => {
163+ expect ( firstSheetData . sheet_id ) . toStrictEqual ( sheetId ) ;
164+ expect ( firstSheetData . cached_at ) . toStrictEqual ( cacheTimestamp ) ;
165+ expect ( secondSheetData . sheet_id ) . toStrictEqual ( secondSheetId ) ;
166+ expect ( secondSheetData . cached_at ) . toStrictEqual (
167+ secondSheetCacheTimestamp
168+ ) ;
169+ } ) ;
170+ it ( 'All events cached are returned' , ( ) => {
171+ expect ( getRightOrFail ( firstSheetData . cached_data ) ) . toHaveLength ( 2 ) ;
172+ expect ( getRightOrFail ( secondSheetData . cached_data ) ) . toHaveLength ( 2 ) ;
173+ } ) ;
174+ } ) ;
62175 } ) ;
63176} ) ;
0 commit comments