1
1
import { persisted , writable } from '../index'
2
2
import { get } from 'svelte/store'
3
3
import { expect , vi , beforeEach , describe , test , it } from 'vitest'
4
+ import localforage from 'localforage'
4
5
5
- beforeEach ( ( ) => localStorage . clear ( ) )
6
+ beforeEach ( async ( ) => {
7
+ await localforage . clear ( ) ;
8
+ /* Set the driver to localStorage, overriding the default IndexedDB,
9
+ since localStorage is used in all but the final two tests. */
10
+ await localforage . setDriver ( localforage . LOCALSTORAGE ) ;
11
+ } )
6
12
7
13
describe ( 'writable()' , ( ) => {
8
- test ( 'it works, but raises deprecation warning' , ( ) => {
14
+ test ( 'it works, but raises deprecation warning' , async ( ) => {
9
15
console . warn = vi . fn ( )
10
16
11
- localStorage . setItem ( 'myKey2' , '"existing"' )
17
+ await localforage . setItem ( 'myKey2' , '"existing"' )
12
18
13
- const store = writable ( 'myKey2' , 'initial' )
19
+ const store = await writable ( 'myKey2' , 'initial' )
14
20
const value = get ( store )
15
21
16
22
expect ( value ) . toEqual ( 'existing' )
@@ -19,120 +25,120 @@ describe('writable()', () => {
19
25
} )
20
26
21
27
describe ( 'persisted()' , ( ) => {
22
- test ( 'uses initial value if nothing in local storage' , ( ) => {
23
- const store = persisted ( 'myKey' , 123 )
28
+ test ( 'uses initial value if nothing in local storage' , async ( ) => {
29
+ const store = await persisted ( 'myKey' , 123 )
24
30
const value = get ( store )
25
31
26
32
expect ( value ) . toEqual ( 123 )
27
- expect ( localStorage . myKey ) . toBeUndefined ( )
33
+ expect ( await localforage . getItem ( " myKey" ) ) . toBeNull ( )
28
34
} )
29
35
30
- test ( 'uses existing value if data already in local storage' , ( ) => {
31
- localStorage . setItem ( 'myKey2' , '"existing"' )
36
+ test ( 'uses existing value if data already in local storage' , async ( ) => {
37
+ await localforage . setItem ( 'myKey2' , '"existing"' )
32
38
33
- const store = persisted ( 'myKey2' , 'initial' )
39
+ const store = await persisted ( 'myKey2' , 'initial' )
34
40
const value = get ( store )
35
41
36
42
expect ( value ) . toEqual ( 'existing' )
37
43
} )
38
44
39
45
describe ( 'set()' , ( ) => {
40
- test ( 'replaces old value' , ( ) => {
41
- localStorage . setItem ( 'myKey3' , '"existing"' )
46
+ test ( 'replaces old value' , async ( ) => {
47
+ await localforage . setItem ( 'myKey3' , '"existing"' )
42
48
43
- const store = persisted ( 'myKey3' , '' )
44
- store . set ( 'new-value' )
49
+ const store = await persisted ( 'myKey3' , '' )
50
+ await store . set ( 'new-value' )
45
51
const value = get ( store )
46
52
47
- expect ( localStorage . myKey3 ) . toEqual ( '"new-value"' )
53
+ expect ( await localforage . getItem ( " myKey3" ) ) . toEqual ( '"new-value"' )
48
54
expect ( value ) . toEqual ( 'new-value' )
49
55
} )
50
56
51
- test ( 'adds new value' , ( ) => {
52
- const store = persisted ( 'myKey4' , '' )
53
- store . set ( 'new-value' )
57
+ test ( 'adds new value' , async ( ) => {
58
+ const store = await persisted ( 'myKey4' , '' )
59
+ await store . set ( 'new-value' )
54
60
const value = get ( store )
55
61
56
- expect ( localStorage . myKey4 ) . toEqual ( '"new-value"' )
62
+ expect ( await localforage . getItem ( " myKey4" ) ) . toEqual ( '"new-value"' )
57
63
expect ( value ) . toEqual ( 'new-value' )
58
64
} )
59
65
} )
60
66
61
67
describe ( 'update()' , ( ) => {
62
- test ( 'replaces old value' , ( ) => {
63
- const store = persisted ( 'myKey5' , 123 )
68
+ test ( 'replaces old value' , async ( ) => {
69
+ const store = await persisted ( 'myKey5' , 123 )
64
70
store . update ( n => n + 1 )
65
71
const value = get ( store )
66
72
67
- expect ( localStorage . myKey5 ) . toEqual ( '124' )
73
+ expect ( await ( await localforage . getItem ( " myKey5" ) ) ) . toEqual ( '124' )
68
74
expect ( value ) . toEqual ( 124 )
69
75
} )
70
76
71
- test ( 'adds new value' , ( ) => {
72
- const store = persisted ( 'myKey6' , 123 )
73
- store . update ( n => n + 1 )
77
+ test ( 'adds new value' , async ( ) => {
78
+ const store = await persisted ( 'myKey6' , 123 )
79
+ await store . update ( n => n + 1 )
74
80
const value = get ( store )
75
81
76
- expect ( localStorage . myKey6 ) . toEqual ( '124' )
82
+ expect ( await localforage . getItem ( " myKey6" ) ) . toEqual ( '124' )
77
83
expect ( value ) . toEqual ( 124 )
78
84
} )
79
85
80
- test ( "BUG: update should use existing value" , ( ) => {
81
- localStorage . setItem ( 'myKey6b' , '12345' )
82
- const store = persisted ( 'myKey6b' , 123 )
83
- store . update ( n => { n += 1 ; return n } )
86
+ test ( "BUG: update should use existing value" , async ( ) => {
87
+ await localforage . setItem ( 'myKey6b' , '12345' )
88
+ const store = await persisted ( 'myKey6b' , 123 )
89
+ await store . update ( n => { n += 1 ; return n } )
84
90
85
- expect ( localStorage . myKey6b ) . toEqual ( '12346' )
91
+ expect ( await localforage . getItem ( " myKey6b" ) ) . toEqual ( '12346' )
86
92
} )
87
93
} )
88
94
89
95
describe ( 'reset' , ( ) => {
90
- it ( 'resets to initial value' , ( ) => {
91
- const store = persisted ( 'myKey14' , 123 ) ;
92
- store . set ( 456 ) ;
93
- store . reset ( ) ;
96
+ it ( 'resets to initial value' , async ( ) => {
97
+ const store = await persisted ( 'myKey14' , 123 ) ;
98
+ await store . set ( 456 ) ;
99
+ await store . reset ( ) ;
94
100
const value = get ( store ) ;
95
101
96
102
expect ( value ) . toEqual ( 123 ) ;
97
- expect ( localStorage . myKey14 ) . toEqual ( '123' ) ;
103
+ expect ( await localforage . getItem ( " myKey14" ) ) . toEqual ( '123' ) ;
98
104
} ) ;
99
105
} ) ;
100
106
101
107
describe ( 'subscribe()' , ( ) => {
102
- it ( 'publishes updates' , ( ) => {
103
- const store = persisted ( 'myKey7' , 123 )
108
+ it ( 'publishes updates' , async ( ) => {
109
+ const store = await persisted ( 'myKey7' , 123 )
104
110
const values : number [ ] = [ ]
105
111
const unsub = store . subscribe ( ( value : number ) => {
106
112
if ( value !== undefined ) values . push ( value )
107
113
} )
108
- store . set ( 456 )
109
- store . set ( 999 )
114
+ await store . set ( 456 )
115
+ await store . set ( 999 )
110
116
111
117
expect ( values ) . toEqual ( [ 123 , 456 , 999 ] )
112
118
113
119
unsub ( )
114
120
} )
115
121
} )
116
122
117
- it ( 'handles duplicate stores with the same key' , ( ) => {
118
- const store1 = persisted ( 'same-key' , 1 )
123
+ it ( 'handles duplicate stores with the same key' , async ( ) => {
124
+ const store1 = await persisted ( 'same-key' , 1 )
119
125
const values1 : number [ ] = [ ]
120
126
121
- const unsub1 = store1 . subscribe ( value => {
127
+ const unsub1 = ( await store1 ) . subscribe ( value => {
122
128
values1 . push ( value )
123
129
} )
124
130
125
- store1 . set ( 2 )
131
+ await store1 . set ( 2 )
126
132
127
- const store2 = persisted ( 'same-key' , 99 )
133
+ const store2 = await persisted ( 'same-key' , 99 )
128
134
const values2 : number [ ] = [ ]
129
135
130
- const unsub2 = store2 . subscribe ( value => {
136
+ const unsub2 = ( await store2 ) . subscribe ( value => {
131
137
values2 . push ( value )
132
138
} )
133
139
134
- store1 . set ( 3 )
135
- store2 . set ( 4 )
140
+ await store1 . set ( 3 )
141
+ await store2 . set ( 4 )
136
142
137
143
expect ( values1 ) . toEqual ( [ 1 , 2 , 3 , 4 ] )
138
144
expect ( values2 ) . toEqual ( [ 2 , 3 , 4 ] )
@@ -145,13 +151,13 @@ describe('persisted()', () => {
145
151
} )
146
152
147
153
describe ( "beforeRead and beforeWrite" , ( ) => {
148
- it ( "allows modifying initial value before reading" , ( ) => {
149
- localStorage . setItem ( "beforeRead-init-test" , JSON . stringify ( 2 ) )
150
- const store = persisted ( "beforeRead-init-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
154
+ it ( "allows modifying initial value before reading" , async ( ) => {
155
+ await localforage . setItem ( "beforeRead-init-test" , JSON . stringify ( 2 ) )
156
+ const store = await persisted ( "beforeRead-init-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
151
157
expect ( get ( store ) ) . toEqual ( 4 )
152
158
} )
153
- it ( "allows modifying value before reading upon event" , ( ) => {
154
- const store = persisted ( "beforeRead-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
159
+ it ( "allows modifying value before reading upon event" , async ( ) => {
160
+ const store = await persisted ( "beforeRead-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
155
161
const values : number [ ] = [ ]
156
162
157
163
const unsub = store . subscribe ( ( val : number ) => {
@@ -166,19 +172,19 @@ describe('persisted()', () => {
166
172
unsub ( )
167
173
} )
168
174
169
- it ( "allows modifying value before writing" , ( ) => {
170
- const store = persisted ( "beforeWrite-test" , 0 , { beforeWrite : ( v ) => v * 2 } )
171
- store . set ( 2 )
175
+ it ( "allows modifying value before writing" , async ( ) => {
176
+ const store = await persisted ( "beforeWrite-test" , 0 , { beforeWrite : ( v ) => v * 2 } )
177
+ await store . set ( 2 )
172
178
173
- expect ( JSON . parse ( localStorage . getItem ( "beforeWrite-test" ) as string ) ) . toEqual ( 4 )
179
+ expect ( JSON . parse ( await localforage . getItem ( "beforeWrite-test" ) as string ) ) . toEqual ( 4 )
174
180
} )
175
181
} )
176
182
177
183
describe ( 'handles window.storage event' , ( ) => {
178
184
type NumberDict = { [ key : string ] : number }
179
185
180
- it ( 'sets storage when key matches' , ( ) => {
181
- const store = persisted ( 'myKey8' , { a : 1 } )
186
+ it ( 'sets storage when key matches' , async ( ) => {
187
+ const store = await persisted ( 'myKey8' , { a : 1 } )
182
188
const values : NumberDict [ ] = [ ]
183
189
184
190
const unsub = store . subscribe ( ( value : NumberDict ) => {
@@ -193,8 +199,8 @@ describe('persisted()', () => {
193
199
unsub ( )
194
200
} )
195
201
196
- it ( 'ignores storages events when value is null' , ( ) => {
197
- const store = persisted ( 'myKey9' , { a : 1 } )
202
+ it ( 'ignores storages events when value is null' , async ( ) => {
203
+ const store = await persisted ( 'myKey9' , { a : 1 } )
198
204
const values : NumberDict [ ] = [ ]
199
205
200
206
const unsub = store . subscribe ( ( value : NumberDict ) => {
@@ -209,8 +215,8 @@ describe('persisted()', () => {
209
215
unsub ( )
210
216
} )
211
217
212
- it ( "doesn't update store when key doesn't match" , ( ) => {
213
- const store = persisted ( 'myKey10' , 1 )
218
+ it ( "doesn't update store when key doesn't match" , async ( ) => {
219
+ const store = await persisted ( 'myKey10' , 1 )
214
220
const values : number [ ] = [ ]
215
221
216
222
const unsub = store . subscribe ( ( value : number ) => {
@@ -225,10 +231,10 @@ describe('persisted()', () => {
225
231
unsub ( )
226
232
} )
227
233
228
- it ( "doesn't update store when there are no subscribers" , ( ) => {
229
- localStorage . setItem ( 'myKeyb' , '2' )
234
+ it ( "doesn't update store when there are no subscribers" , async ( ) => {
235
+ await localforage . setItem ( 'myKeyb' , '2' )
230
236
231
- const store = persisted ( 'myKeyb' , 1 )
237
+ const store = await persisted ( 'myKeyb' , 1 )
232
238
const values : number [ ] = [ ]
233
239
234
240
const event = new StorageEvent ( 'storage' , { key : 'myKeyb' , newValue : '2' } )
@@ -243,8 +249,8 @@ describe('persisted()', () => {
243
249
unsub ( )
244
250
} )
245
251
246
- it ( 'ignores session-backed stores' , ( ) => {
247
- const store = persisted ( 'myKey10' , 1 , { storage : 'session' } )
252
+ it ( 'ignores session-backed stores' , async ( ) => {
253
+ const store = await persisted ( 'myKey10' , 1 , { storage : 'session' } )
248
254
const values : number [ ] = [ ]
249
255
250
256
const unsub = store . subscribe ( ( value ) => {
@@ -259,8 +265,8 @@ describe('persisted()', () => {
259
265
unsub ( )
260
266
} )
261
267
262
- it ( "doesn't update, when syncTabs option is disabled" , ( ) => {
263
- const store = persisted ( 'myKey13' , 1 , { syncTabs : false } )
268
+ it ( "doesn't update, when syncTabs option is disabled" , async ( ) => {
269
+ const store = await persisted ( 'myKey13' , 1 , { syncTabs : false } )
264
270
const values : number [ ] = [ ]
265
271
266
272
const unsub = store . subscribe ( ( value ) => {
@@ -276,21 +282,21 @@ describe('persisted()', () => {
276
282
} )
277
283
} )
278
284
279
- it ( 'allows custom serialize/deserialize functions' , ( ) => {
285
+ it ( 'allows custom serialize/deserialize functions' , async ( ) => {
280
286
const serializer = {
281
287
stringify : ( set : Set < number > ) => JSON . stringify ( Array . from ( set ) ) ,
282
288
parse : ( json : string ) => new Set ( JSON . parse ( json ) ) ,
283
289
}
284
290
285
291
const testSet = new Set ( [ 1 , 2 , 3 ] )
286
292
287
- const store = persisted ( 'myKey11' , testSet , { serializer } )
293
+ const store = await persisted ( 'myKey11' , testSet , { serializer } )
288
294
const value = get ( store )
289
295
290
- store . update ( d => d . add ( 4 ) )
296
+ await store . update ( d => d . add ( 4 ) )
291
297
292
298
expect ( value ) . toEqual ( testSet )
293
- expect ( localStorage . myKey11 ) . toEqual ( serializer . stringify ( new Set ( [ 1 , 2 , 3 , 4 ] ) ) )
299
+ expect ( await localforage . getItem ( " myKey11" ) ) . toEqual ( serializer . stringify ( new Set ( [ 1 , 2 , 3 , 4 ] ) ) )
294
300
} )
295
301
296
302
it ( 'lets you switch storage type' , ( ) => {
@@ -299,11 +305,11 @@ describe('persisted()', () => {
299
305
300
306
const value = 'foo'
301
307
302
- const store = persisted ( 'myKey12' , value , {
308
+ const store = await persisted ( 'myKey12' , value , {
303
309
storage : 'session'
304
310
} )
305
311
306
- store . set ( 'bar' )
312
+ await store . set ( 'bar' )
307
313
308
314
expect ( window . sessionStorage . setItem ) . toHaveBeenCalled ( )
309
315
} )
0 commit comments