@@ -29,8 +29,10 @@ describe.each(storages)('validateCache', (storage) => {
2929 for ( let i = 0 ; i < storage . length ; i ++ ) storage . removeItem ( storage . key ( i ) as string ) ;
3030 } ) ;
3131
32- test ( 'if there is no cache, it should return false' , async ( ) => {
33- expect ( await validateCache ( { } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( false ) ;
32+ test ( 'if there is no cache, it should return initialCacheLoad: true' , async ( ) => {
33+ const result = await validateCache ( { } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
34+ expect ( result . initialCacheLoad ) . toBe ( true ) ;
35+ expect ( result . lastUpdateTimestamp ) . toBeUndefined ( ) ;
3436
3537 expect ( logSpy ) . not . toHaveBeenCalled ( ) ;
3638
@@ -44,12 +46,16 @@ describe.each(storages)('validateCache', (storage) => {
4446 expect ( storage . getItem ( keys . buildLastClear ( ) ) ) . toBeNull ( ) ;
4547 } ) ;
4648
47- test ( 'if there is cache and it must not be cleared, it should return true' , async ( ) => {
49+ test ( 'if there is cache and it must not be cleared, it should return initialCacheLoad: false' , async ( ) => {
50+ const lastUpdateTimestamp = Date . now ( ) - 1000 * 60 * 60 ; // 1 hour ago
4851 storage . setItem ( keys . buildSplitsTillKey ( ) , '1' ) ;
4952 storage . setItem ( keys . buildHashKey ( ) , FULL_SETTINGS_HASH ) ;
53+ storage . setItem ( keys . buildLastUpdatedKey ( ) , lastUpdateTimestamp + '' ) ;
5054 await storage . save && storage . save ( ) ;
5155
52- expect ( await validateCache ( { } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( true ) ;
56+ const result = await validateCache ( { } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
57+ expect ( result . initialCacheLoad ) . toBe ( false ) ;
58+ expect ( result . lastUpdateTimestamp ) . toBe ( lastUpdateTimestamp ) ;
5359
5460 expect ( logSpy ) . not . toHaveBeenCalled ( ) ;
5561
@@ -63,13 +69,15 @@ describe.each(storages)('validateCache', (storage) => {
6369 expect ( storage . getItem ( keys . buildLastClear ( ) ) ) . toBeNull ( ) ;
6470 } ) ;
6571
66- test ( 'if there is cache and it has expired, it should clear cache and return false ' , async ( ) => {
72+ test ( 'if there is cache and it has expired, it should clear cache and return initialCacheLoad: true ' , async ( ) => {
6773 storage . setItem ( keys . buildSplitsTillKey ( ) , '1' ) ;
6874 storage . setItem ( keys . buildHashKey ( ) , FULL_SETTINGS_HASH ) ;
6975 storage . setItem ( keys . buildLastUpdatedKey ( ) , Date . now ( ) - 1000 * 60 * 60 * 24 * 2 + '' ) ; // 2 days ago
7076 await storage . save && storage . save ( ) ;
7177
72- expect ( await validateCache ( { expirationDays : 1 } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( false ) ;
78+ const result = await validateCache ( { expirationDays : 1 } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
79+ expect ( result . initialCacheLoad ) . toBe ( true ) ;
80+ expect ( result . lastUpdateTimestamp ) . toBeUndefined ( ) ;
7381
7482 expect ( logSpy ) . toHaveBeenCalledWith ( 'storage:localstorage: Cache expired more than 1 days ago. Cleaning up cache' ) ;
7583
@@ -82,12 +90,14 @@ describe.each(storages)('validateCache', (storage) => {
8290 expect ( nearlyEqual ( parseInt ( storage . getItem ( keys . buildLastClear ( ) ) as string ) , Date . now ( ) ) ) . toBe ( true ) ;
8391 } ) ;
8492
85- test ( 'if there is cache and its hash has changed, it should clear cache and return false ' , async ( ) => {
93+ test ( 'if there is cache and its hash has changed, it should clear cache and return initialCacheLoad: true ' , async ( ) => {
8694 storage . setItem ( keys . buildSplitsTillKey ( ) , '1' ) ;
8795 storage . setItem ( keys . buildHashKey ( ) , FULL_SETTINGS_HASH ) ;
8896 await storage . save && storage . save ( ) ;
8997
90- expect ( await validateCache ( { } , storage , { ...fullSettings , core : { ...fullSettings . core , authorizationKey : 'another-sdk-key' } } , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( false ) ;
98+ const result = await validateCache ( { } , storage , { ...fullSettings , core : { ...fullSettings . core , authorizationKey : 'another-sdk-key' } } , keys , splits , rbSegments , segments , largeSegments ) ;
99+ expect ( result . initialCacheLoad ) . toBe ( true ) ;
100+ expect ( result . lastUpdateTimestamp ) . toBeUndefined ( ) ;
91101
92102 expect ( logSpy ) . toHaveBeenCalledWith ( 'storage:localstorage: SDK key, flags filter criteria, or flags spec version has changed. Cleaning up cache' ) ;
93103
@@ -100,14 +110,16 @@ describe.each(storages)('validateCache', (storage) => {
100110 expect ( nearlyEqual ( parseInt ( storage . getItem ( keys . buildLastClear ( ) ) as string ) , Date . now ( ) ) ) . toBe ( true ) ;
101111 } ) ;
102112
103- test ( 'if there is cache and clearOnInit is true, it should clear cache and return false ' , async ( ) => {
113+ test ( 'if there is cache and clearOnInit is true, it should clear cache and return initialCacheLoad: true ' , async ( ) => {
104114 // Older cache version (without last clear)
105115 storage . removeItem ( keys . buildLastClear ( ) ) ;
106116 storage . setItem ( keys . buildSplitsTillKey ( ) , '1' ) ;
107117 storage . setItem ( keys . buildHashKey ( ) , FULL_SETTINGS_HASH ) ;
108118 await storage . save && storage . save ( ) ;
109119
110- expect ( await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( false ) ;
120+ const result = await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
121+ expect ( result . initialCacheLoad ) . toBe ( true ) ;
122+ expect ( result . lastUpdateTimestamp ) . toBeUndefined ( ) ;
111123
112124 expect ( logSpy ) . toHaveBeenCalledWith ( 'storage:localstorage: clearOnInit was set and cache was not cleared in the last 24 hours. Cleaning up cache' ) ;
113125
@@ -122,14 +134,20 @@ describe.each(storages)('validateCache', (storage) => {
122134
123135 // If cache is cleared, it should not clear again until a day has passed
124136 logSpy . mockClear ( ) ;
137+ const lastUpdateTimestamp = Date . now ( ) - 1000 * 60 * 60 ; // 1 hour ago
125138 storage . setItem ( keys . buildSplitsTillKey ( ) , '1' ) ;
126- expect ( await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( true ) ;
139+ storage . setItem ( keys . buildLastUpdatedKey ( ) , lastUpdateTimestamp + '' ) ;
140+ const result2 = await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
141+ expect ( result2 . initialCacheLoad ) . toBe ( false ) ;
142+ expect ( result2 . lastUpdateTimestamp ) . toBe ( lastUpdateTimestamp ) ;
127143 expect ( logSpy ) . not . toHaveBeenCalled ( ) ;
128144 expect ( storage . getItem ( keys . buildLastClear ( ) ) ) . toBe ( lastClear ) ; // Last clear should not have changed
129145
130146 // If a day has passed, it should clear again
131147 storage . setItem ( keys . buildLastClear ( ) , ( Date . now ( ) - 1000 * 60 * 60 * 24 - 1 ) + '' ) ;
132- expect ( await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ) . toBe ( false ) ;
148+ const result3 = await validateCache ( { clearOnInit : true } , storage , fullSettings , keys , splits , rbSegments , segments , largeSegments ) ;
149+ expect ( result3 . initialCacheLoad ) . toBe ( true ) ;
150+ expect ( result3 . lastUpdateTimestamp ) . toBeUndefined ( ) ;
133151 expect ( logSpy ) . toHaveBeenCalledWith ( 'storage:localstorage: clearOnInit was set and cache was not cleared in the last 24 hours. Cleaning up cache' ) ;
134152 expect ( splits . clear ) . toHaveBeenCalledTimes ( 2 ) ;
135153 expect ( rbSegments . clear ) . toHaveBeenCalledTimes ( 2 ) ;
0 commit comments