Skip to content

Commit d9e9494

Browse files
committed
chore: Make tests compatible with localforage
- Use async/await
1 parent ccc2c4f commit d9e9494

File tree

3 files changed

+112
-99
lines changed

3 files changed

+112
-99
lines changed

test/localStorageStore.test.ts

Lines changed: 82 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import { persisted, writable } from '../index'
22
import { get } from 'svelte/store'
33
import { expect, vi, beforeEach, describe, test, it } from 'vitest'
4+
import localforage from 'localforage'
45

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+
})
612

713
describe('writable()', () => {
8-
test('it works, but raises deprecation warning', () => {
14+
test('it works, but raises deprecation warning', async () => {
915
console.warn = vi.fn()
1016

11-
localStorage.setItem('myKey2', '"existing"')
17+
await localforage.setItem('myKey2', '"existing"')
1218

13-
const store = writable('myKey2', 'initial')
19+
const store = await writable('myKey2', 'initial')
1420
const value = get(store)
1521

1622
expect(value).toEqual('existing')
@@ -19,120 +25,120 @@ describe('writable()', () => {
1925
})
2026

2127
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)
2430
const value = get(store)
2531

2632
expect(value).toEqual(123)
27-
expect(localStorage.myKey).toBeUndefined()
33+
expect(await localforage.getItem("myKey")).toBeNull()
2834
})
2935

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"')
3238

33-
const store = persisted('myKey2', 'initial')
39+
const store = await persisted('myKey2', 'initial')
3440
const value = get(store)
3541

3642
expect(value).toEqual('existing')
3743
})
3844

3945
describe('set()', () => {
40-
test('replaces old value', () => {
41-
localStorage.setItem('myKey3', '"existing"')
46+
test('replaces old value', async () => {
47+
await localforage.setItem('myKey3', '"existing"')
4248

43-
const store = persisted('myKey3', '')
44-
store.set('new-value')
49+
const store = await persisted('myKey3', '')
50+
await store.set('new-value')
4551
const value = get(store)
4652

47-
expect(localStorage.myKey3).toEqual('"new-value"')
53+
expect(await localforage.getItem("myKey3")).toEqual('"new-value"')
4854
expect(value).toEqual('new-value')
4955
})
5056

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')
5460
const value = get(store)
5561

56-
expect(localStorage.myKey4).toEqual('"new-value"')
62+
expect(await localforage.getItem("myKey4")).toEqual('"new-value"')
5763
expect(value).toEqual('new-value')
5864
})
5965
})
6066

6167
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)
6470
store.update(n => n + 1)
6571
const value = get(store)
6672

67-
expect(localStorage.myKey5).toEqual('124')
73+
expect(await (await localforage.getItem("myKey5"))).toEqual('124')
6874
expect(value).toEqual(124)
6975
})
7076

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)
7480
const value = get(store)
7581

76-
expect(localStorage.myKey6).toEqual('124')
82+
expect(await localforage.getItem("myKey6")).toEqual('124')
7783
expect(value).toEqual(124)
7884
})
7985

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 })
8490

85-
expect(localStorage.myKey6b).toEqual('12346')
91+
expect(await localforage.getItem("myKey6b")).toEqual('12346')
8692
})
8793
})
8894

8995
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();
94100
const value = get(store);
95101

96102
expect(value).toEqual(123);
97-
expect(localStorage.myKey14).toEqual('123');
103+
expect(await localforage.getItem("myKey14")).toEqual('123');
98104
});
99105
});
100106

101107
describe('subscribe()', () => {
102-
it('publishes updates', () => {
103-
const store = persisted('myKey7', 123)
108+
it('publishes updates', async () => {
109+
const store = await persisted('myKey7', 123)
104110
const values: number[] = []
105111
const unsub = store.subscribe((value: number) => {
106112
if (value !== undefined) values.push(value)
107113
})
108-
store.set(456)
109-
store.set(999)
114+
await store.set(456)
115+
await store.set(999)
110116

111117
expect(values).toEqual([123, 456, 999])
112118

113119
unsub()
114120
})
115121
})
116122

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)
119125
const values1: number[] = []
120126

121-
const unsub1 = store1.subscribe(value => {
127+
const unsub1 = (await store1).subscribe(value => {
122128
values1.push(value)
123129
})
124130

125-
store1.set(2)
131+
await store1.set(2)
126132

127-
const store2 = persisted('same-key', 99)
133+
const store2 = await persisted('same-key', 99)
128134
const values2: number[] = []
129135

130-
const unsub2 = store2.subscribe(value => {
136+
const unsub2 = (await store2).subscribe(value => {
131137
values2.push(value)
132138
})
133139

134-
store1.set(3)
135-
store2.set(4)
140+
await store1.set(3)
141+
await store2.set(4)
136142

137143
expect(values1).toEqual([1, 2, 3, 4])
138144
expect(values2).toEqual([2, 3, 4])
@@ -145,13 +151,13 @@ describe('persisted()', () => {
145151
})
146152

147153
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 })
151157
expect(get(store)).toEqual(4)
152158
})
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 })
155161
const values: number[] = []
156162

157163
const unsub = store.subscribe((val: number) => {
@@ -166,19 +172,19 @@ describe('persisted()', () => {
166172
unsub()
167173
})
168174

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)
172178

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)
174180
})
175181
})
176182

177183
describe('handles window.storage event', () => {
178184
type NumberDict = { [key: string]: number }
179185

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 })
182188
const values: NumberDict[] = []
183189

184190
const unsub = store.subscribe((value: NumberDict) => {
@@ -193,8 +199,8 @@ describe('persisted()', () => {
193199
unsub()
194200
})
195201

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 })
198204
const values: NumberDict[] = []
199205

200206
const unsub = store.subscribe((value: NumberDict) => {
@@ -209,8 +215,8 @@ describe('persisted()', () => {
209215
unsub()
210216
})
211217

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)
214220
const values: number[] = []
215221

216222
const unsub = store.subscribe((value: number) => {
@@ -225,10 +231,10 @@ describe('persisted()', () => {
225231
unsub()
226232
})
227233

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')
230236

231-
const store = persisted('myKeyb', 1)
237+
const store = await persisted('myKeyb', 1)
232238
const values: number[] = []
233239

234240
const event = new StorageEvent('storage', { key: 'myKeyb', newValue: '2' })
@@ -243,8 +249,8 @@ describe('persisted()', () => {
243249
unsub()
244250
})
245251

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' })
248254
const values: number[] = []
249255

250256
const unsub = store.subscribe((value) => {
@@ -259,8 +265,8 @@ describe('persisted()', () => {
259265
unsub()
260266
})
261267

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 })
264270
const values: number[] = []
265271

266272
const unsub = store.subscribe((value) => {
@@ -276,21 +282,21 @@ describe('persisted()', () => {
276282
})
277283
})
278284

279-
it('allows custom serialize/deserialize functions', () => {
285+
it('allows custom serialize/deserialize functions', async () => {
280286
const serializer = {
281287
stringify: (set: Set<number>) => JSON.stringify(Array.from(set)),
282288
parse: (json: string) => new Set(JSON.parse(json)),
283289
}
284290

285291
const testSet = new Set([1, 2, 3])
286292

287-
const store = persisted('myKey11', testSet, { serializer })
293+
const store = await persisted('myKey11', testSet, { serializer })
288294
const value = get(store)
289295

290-
store.update(d => d.add(4))
296+
await store.update(d => d.add(4))
291297

292298
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])))
294300
})
295301

296302
it('lets you switch storage type', () => {
@@ -299,11 +305,11 @@ describe('persisted()', () => {
299305

300306
const value = 'foo'
301307

302-
const store = persisted('myKey12', value, {
308+
const store = await persisted('myKey12', value, {
303309
storage: 'session'
304310
})
305311

306-
store.set('bar')
312+
await store.set('bar')
307313

308314
expect(window.sessionStorage.setItem).toHaveBeenCalled()
309315
})

test/readDomExceptions.test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1+
import localforage from 'localforage'
12
import { persisted } from '../index'
23
import { expect, vi, beforeEach, describe, it } from 'vitest'
34

45
beforeEach(() => localStorage.clear())
56

67
describe('persisted()', () => {
78

8-
it('logs error encountered when reading from local storage', () => {
9+
it('logs error encountered when reading from local storage', async () => {
910
const consoleMock = vi.spyOn(console, 'error').mockImplementation(() => undefined);
10-
localStorage.setItem("myKey", "INVALID JSON")
11-
persisted('myKey', '')
11+
await localforage.setItem("myKey", "INVALID JSON")
12+
await persisted('myKey', '')
1213

1314
expect(consoleMock).toHaveBeenCalledWith('Error when parsing "INVALID JSON" from persisted store "myKey"', expect.any(SyntaxError))
1415
consoleMock.mockReset();
1516
})
1617

17-
it('calls custom error function upon init', () => {
18+
it('calls custom error function upon init', async () => {
1819
const mockFunc = vi.fn()
1920

20-
localStorage.setItem("myKey2", "INVALID JSON")
21-
persisted('myKey2', '', { onParseError: mockFunc })
21+
await localforage.setItem("myKey2", "INVALID JSON")
22+
await persisted('myKey2', '', { onParseError: mockFunc })
2223

2324
expect(mockFunc).toHaveBeenCalledOnce()
2425
})
2526

26-
it('calls custom error function upon external write', () => {
27+
it('calls custom error function upon external write', async () => {
2728
const mockFunc = vi.fn()
2829

29-
const store = persisted('myKey3', '', { onParseError: mockFunc })
30+
const store = await persisted('myKey3', '', { onParseError: mockFunc })
3031
const unsub = store.subscribe(() => undefined)
3132

3233
const event = new StorageEvent('storage', { key: 'myKey3', newValue: 'INVALID JSON' })

0 commit comments

Comments
 (0)