Skip to content

Commit 6ba2711

Browse files
committed
feat: use MemoryProvider in unit-tests
1 parent e8dd490 commit 6ba2711

File tree

3 files changed

+44
-107
lines changed

3 files changed

+44
-107
lines changed

lib/storage/__mocks__/index.ts

+22-85
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,27 @@
1-
import utils from '../../utils';
2-
import type {Key, KeyValuePairList, Value} from '../providers/types';
3-
import type StorageProvider from '../providers/types';
1+
import MemoryOnlyProvider, {mockStore, mockSet, setMockStore} from '../providers/MemoryOnlyProvider';
42

5-
let storageMapInternal: Record<Key, Value> = {};
3+
const init = jest.fn(MemoryOnlyProvider.init);
64

7-
const set = jest.fn((key, value) => {
8-
storageMapInternal[key] = value;
9-
return Promise.resolve(value);
10-
});
5+
init();
116

12-
const idbKeyvalMock: StorageProvider = {
13-
name: 'KeyValMockProvider',
14-
init: () => undefined,
15-
setItem(key, value) {
16-
return set(key, value);
17-
},
18-
multiSet(pairs) {
19-
const setPromises = pairs.map(([key, value]) => this.setItem(key, value));
20-
return new Promise((resolve) => Promise.all(setPromises).then(() => resolve(storageMapInternal)));
21-
},
22-
getItem(key) {
23-
return Promise.resolve(storageMapInternal[key]);
24-
},
25-
multiGet(keys) {
26-
const getPromises = keys.map((key) => new Promise((resolve) => this.getItem(key).then((value) => resolve([key, value]))));
27-
return Promise.all(getPromises) as Promise<KeyValuePairList>;
28-
},
29-
multiMerge(pairs) {
30-
pairs.forEach(([key, value]) => {
31-
const existingValue = storageMapInternal[key];
32-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
33-
const newValue = utils.fastMerge(existingValue as any, value);
34-
35-
set(key, newValue);
36-
});
37-
38-
return Promise.resolve(storageMapInternal);
39-
},
40-
mergeItem(key, _changes, modifiedData) {
41-
return this.setItem(key, modifiedData);
42-
},
43-
removeItem(key) {
44-
delete storageMapInternal[key];
45-
return Promise.resolve();
46-
},
47-
removeItems(keys) {
48-
keys.forEach((key) => {
49-
delete storageMapInternal[key];
50-
});
51-
return Promise.resolve();
52-
},
53-
clear() {
54-
storageMapInternal = {};
55-
return Promise.resolve();
56-
},
57-
getAllKeys() {
58-
return Promise.resolve(Object.keys(storageMapInternal));
59-
},
60-
getDatabaseSize() {
61-
return Promise.resolve({bytesRemaining: 0, bytesUsed: 99999});
62-
},
63-
// eslint-disable-next-line @typescript-eslint/no-empty-function
64-
setMemoryOnlyKeys() {},
65-
keepInstancesSync: () => undefined,
66-
};
67-
68-
const idbKeyvalMockSpy = {
69-
idbKeyvalSet: set,
70-
init: jest.fn(idbKeyvalMock.init),
71-
setItem: jest.fn(idbKeyvalMock.setItem),
72-
getItem: jest.fn(idbKeyvalMock.getItem),
73-
removeItem: jest.fn(idbKeyvalMock.removeItem),
74-
removeItems: jest.fn(idbKeyvalMock.removeItems),
75-
clear: jest.fn(idbKeyvalMock.clear),
76-
getAllKeys: jest.fn(idbKeyvalMock.getAllKeys),
77-
multiGet: jest.fn(idbKeyvalMock.multiGet),
78-
multiSet: jest.fn(idbKeyvalMock.multiSet),
79-
multiMerge: jest.fn(idbKeyvalMock.multiMerge),
80-
mergeItem: jest.fn(idbKeyvalMock.mergeItem),
81-
getStorageMap: jest.fn(() => storageMapInternal),
82-
setInitialMockData: jest.fn((data) => {
83-
storageMapInternal = data;
84-
}),
85-
getDatabaseSize: jest.fn(idbKeyvalMock.getDatabaseSize),
86-
setMemoryOnlyKeys: jest.fn(idbKeyvalMock.setMemoryOnlyKeys),
87-
keepInstancesSync: jest.fn(idbKeyvalMock.keepInstancesSync),
7+
const StorageMock = {
8+
init,
9+
getItem: jest.fn(MemoryOnlyProvider.getItem),
10+
multiGet: jest.fn(MemoryOnlyProvider.multiGet),
11+
setItem: jest.fn(MemoryOnlyProvider.setItem),
12+
multiSet: jest.fn(MemoryOnlyProvider.multiSet),
13+
mergeItem: jest.fn(MemoryOnlyProvider.mergeItem),
14+
multiMerge: jest.fn(MemoryOnlyProvider.multiMerge),
15+
removeItem: jest.fn(MemoryOnlyProvider.removeItem),
16+
removeItems: jest.fn(MemoryOnlyProvider.removeItems),
17+
clear: jest.fn(MemoryOnlyProvider.clear),
18+
setMemoryOnlyKeys: jest.fn(MemoryOnlyProvider.setMemoryOnlyKeys),
19+
getAllKeys: jest.fn(MemoryOnlyProvider.getAllKeys),
20+
getDatabaseSize: jest.fn(MemoryOnlyProvider.getDatabaseSize),
21+
keepInstancesSync: jest.fn(),
22+
mockSet,
23+
getMockStore: jest.fn(() => mockStore),
24+
setMockStore: jest.fn((data) => setMockStore(data)),
8825
};
8926

90-
export default idbKeyvalMockSpy;
27+
export default StorageMock;

tests/unit/onyxMultiMergeWebStorageTest.js

+18-18
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ describe('Onyx.mergeCollection() and WebStorage', () => {
3232
afterEach(() => Onyx.clear());
3333

3434
it('merges two sets of data consecutively', () => {
35-
StorageMock.setInitialMockData(initialData);
35+
StorageMock.setMockStore(initialData);
3636

3737
// Given initial data in storage
38-
expect(StorageMock.getStorageMap().test_1).toEqual(initialTestObject);
39-
expect(StorageMock.getStorageMap().test_2).toEqual(initialTestObject);
40-
expect(StorageMock.getStorageMap().test_3).toEqual(initialTestObject);
38+
expect(StorageMock.getMockStore().test_1).toEqual(initialTestObject);
39+
expect(StorageMock.getMockStore().test_2).toEqual(initialTestObject);
40+
expect(StorageMock.getMockStore().test_3).toEqual(initialTestObject);
4141

4242
// And an empty cache values for the collection keys
4343
expect(OnyxCache.getValue('test_1')).not.toBeDefined();
@@ -75,17 +75,17 @@ describe('Onyx.mergeCollection() and WebStorage', () => {
7575
expect(OnyxCache.getValue('test_3')).toEqual(finalObject);
7676

7777
// And the storage should reflect the same state
78-
expect(StorageMock.getStorageMap().test_1).toEqual(finalObject);
79-
expect(StorageMock.getStorageMap().test_2).toEqual(finalObject);
80-
expect(StorageMock.getStorageMap().test_3).toEqual(finalObject);
78+
expect(StorageMock.getMockStore().test_1).toEqual(finalObject);
79+
expect(StorageMock.getMockStore().test_2).toEqual(finalObject);
80+
expect(StorageMock.getMockStore().test_3).toEqual(finalObject);
8181
});
8282
});
8383

8484
it('cache updates correctly when accessed again if keys are removed or evicted', () => {
8585
// Given empty storage
86-
expect(StorageMock.getStorageMap().test_1).toBeFalsy();
87-
expect(StorageMock.getStorageMap().test_2).toBeFalsy();
88-
expect(StorageMock.getStorageMap().test_3).toBeFalsy();
86+
expect(StorageMock.getMockStore().test_1).toBeFalsy();
87+
expect(StorageMock.getMockStore().test_2).toBeFalsy();
88+
expect(StorageMock.getMockStore().test_3).toBeFalsy();
8989

9090
// And an empty cache values for the collection keys
9191
expect(OnyxCache.getValue('test_1')).toBeFalsy();
@@ -106,9 +106,9 @@ describe('Onyx.mergeCollection() and WebStorage', () => {
106106
expect(OnyxCache.getValue('test_1')).toEqual(data);
107107
expect(OnyxCache.getValue('test_2')).toEqual(data);
108108
expect(OnyxCache.getValue('test_3')).toEqual(data);
109-
expect(StorageMock.getStorageMap().test_1).toEqual(data);
110-
expect(StorageMock.getStorageMap().test_2).toEqual(data);
111-
expect(StorageMock.getStorageMap().test_3).toEqual(data);
109+
expect(StorageMock.getMockStore().test_1).toEqual(data);
110+
expect(StorageMock.getMockStore().test_2).toEqual(data);
111+
expect(StorageMock.getMockStore().test_3).toEqual(data);
112112

113113
// When we drop all the cache keys (but do not modify the underlying storage) and merge another object
114114
OnyxCache.drop('test_1');
@@ -137,15 +137,15 @@ describe('Onyx.mergeCollection() and WebStorage', () => {
137137
expect(OnyxCache.getValue('test_3')).toEqual(finalObject);
138138

139139
// And the storage should reflect the same state
140-
expect(StorageMock.getStorageMap().test_1).toEqual(finalObject);
141-
expect(StorageMock.getStorageMap().test_2).toEqual(finalObject);
142-
expect(StorageMock.getStorageMap().test_3).toEqual(finalObject);
140+
expect(StorageMock.getMockStore().test_1).toEqual(finalObject);
141+
expect(StorageMock.getMockStore().test_2).toEqual(finalObject);
142+
expect(StorageMock.getMockStore().test_3).toEqual(finalObject);
143143
});
144144
});
145145

146146
it('setItem() and multiMerge()', () => {
147147
// Onyx should be empty after clear() is called
148-
expect(StorageMock.getStorageMap()).toEqual({});
148+
expect(StorageMock.getMockStore()).toEqual({});
149149

150150
// Given no previous data and several calls to setItem and call to mergeCollection to update a given key
151151

@@ -174,7 +174,7 @@ describe('Onyx.mergeCollection() and WebStorage', () => {
174174
};
175175

176176
expect(OnyxCache.getValue('test_1')).toEqual(finalObject);
177-
expect(StorageMock.getStorageMap().test_1).toEqual(finalObject);
177+
expect(StorageMock.getMockStore().test_1).toEqual(finalObject);
178178
});
179179
});
180180
});

tests/unit/storage/providers/IDBKeyvalProviderTest.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ describe('storage/providers/IDBKeyVal', () => {
6464
]);
6565

6666
return waitForPromisesToResolve().then(() => {
67-
IDBKeyValProviderMock.idbKeyvalSet.mockClear();
67+
IDBKeyValProviderMock.mockSet.mockClear();
6868

6969
// Given deltas matching existing structure
7070
const USER_1_DELTA = {
@@ -83,7 +83,7 @@ describe('storage/providers/IDBKeyVal', () => {
8383
['@USER_2', USER_2_DELTA],
8484
]).then(() => {
8585
// Then each existing item should be set with the merged content
86-
expect(IDBKeyValProviderMock.idbKeyvalSet).toHaveBeenNthCalledWith(1, '@USER_1', {
86+
expect(IDBKeyValProviderMock.mockSet).toHaveBeenNthCalledWith(1, '@USER_1', {
8787
name: 'Tom',
8888
age: 31,
8989
traits: {
@@ -92,7 +92,7 @@ describe('storage/providers/IDBKeyVal', () => {
9292
},
9393
});
9494

95-
expect(IDBKeyValProviderMock.idbKeyvalSet).toHaveBeenNthCalledWith(2, '@USER_2', {
95+
expect(IDBKeyValProviderMock.mockSet).toHaveBeenNthCalledWith(2, '@USER_2', {
9696
name: 'Sarah',
9797
age: 26,
9898
traits: {
@@ -131,7 +131,7 @@ describe('storage/providers/IDBKeyVal', () => {
131131
// If StorageProvider.clear() does not abort the queue, more idbKeyval.setItem calls would be executed because they would
132132
// be sitting in the setItemQueue
133133
return waitForPromisesToResolve().then(() => {
134-
expect(IDBKeyValProviderMock.idbKeyvalSet).toHaveBeenCalledTimes(0);
134+
expect(IDBKeyValProviderMock.mockSet).toHaveBeenCalledTimes(0);
135135
expect(IDBKeyValProviderMock.clear).toHaveBeenCalledTimes(1);
136136
});
137137
});

0 commit comments

Comments
 (0)