forked from WorldBrain/Memex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstorage-changes.test.ts
89 lines (78 loc) · 3.39 KB
/
storage-changes.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { storageChangesManager, StorageAreaName } from './storage-changes'
const storageAreas: StorageAreaName[] = ['sync', 'local', 'managed']
const testKeyA = 'testA'
const testKeyB = 'testB'
describe('Storage changes listeners manager', () =>
storageAreas.forEach(areaName =>
describe(`${areaName} storage`, () => {
beforeEach(() => storageChangesManager.resetListeners())
test('Can schedule new listeners', () => {
const mockListenerA = jest.fn()
const mockListenerB = jest.fn()
storageChangesManager.addListener(
areaName,
testKeyA,
mockListenerA,
)
const storedListenerA = storageChangesManager['listeners']
.get(areaName)
.get(testKeyA)
expect(storedListenerA).toEqual(mockListenerA)
storageChangesManager.addListener(
areaName,
testKeyB,
mockListenerB,
)
const storedListenerB = storageChangesManager['listeners']
.get(areaName)
.get(testKeyB)
expect(storedListenerB).toEqual(mockListenerB)
})
test('Can invoke scheduled listeners', async () => {
const newData = 'test'
const mockListenerA = jest.fn()
const mockListenerB = jest.fn()
storageChangesManager.addListener(
areaName,
testKeyA,
mockListenerA,
)
storageChangesManager.addListener(
areaName,
testKeyB,
mockListenerB,
)
// Simulate change that affects A
expect(mockListenerA.mock.calls.length).toBe(0)
const change = { oldValue: undefined, newValue: newData }
storageChangesManager['handleChanges'](
{ [testKeyA]: { ...change } },
areaName,
)
expect(mockListenerA.mock.calls.length).toBe(1)
expect(mockListenerA.mock.calls[0][0]).toEqual(change)
// Simulate change that affects B
expect(mockListenerB.mock.calls.length).toBe(0)
storageChangesManager['handleChanges'](
{ [testKeyB]: { ...change } },
areaName,
)
expect(mockListenerB.mock.calls.length).toBe(1)
expect(mockListenerB.mock.calls[0][0]).toEqual(change)
// Simulate change that affects both
expect(mockListenerA.mock.calls.length).toBe(1)
expect(mockListenerB.mock.calls.length).toBe(1)
storageChangesManager['handleChanges'](
{
[testKeyB]: { ...change },
[testKeyA]: { ...change },
},
areaName,
)
expect(mockListenerA.mock.calls.length).toBe(2)
expect(mockListenerB.mock.calls.length).toBe(2)
expect(mockListenerA.mock.calls[0][0]).toEqual(change)
expect(mockListenerB.mock.calls[0][0]).toEqual(change)
})
}),
))