Skip to content

Commit cb90b2f

Browse files
author
Krzysztof Borowy
committed
test: unit tests for web storage
1 parent dd45439 commit cb90b2f

File tree

1 file changed

+147
-51
lines changed

1 file changed

+147
-51
lines changed
Lines changed: 147 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,165 @@
11
import WebStorage from '../src';
22
import 'jest-localstorage-mock';
3+
import idbMock from 'idb-keyval';
34

4-
describe.each([['sessionStorage', false], ['localStorage', true]])(
5-
'WebStorage using %s',
6-
(storageName, storageBool) => {
7-
const webStorage = new WebStorage(storageBool);
8-
const storage: any = storageBool
9-
? window.sessionStorage
10-
: window.localStorage;
5+
jest.mock('idb-keyval', () => {
6+
return {
7+
get: jest.fn(),
8+
set: jest.fn(),
9+
del: jest.fn(),
10+
clear: jest.fn(),
11+
keys: jest.fn(),
12+
};
13+
});
14+
15+
describe('WebStorage', () => {
16+
describe.each([
17+
['session', window.sessionStorage],
18+
['local', window.localStorage],
19+
])('%s storage', (storageName, storageType) => {
20+
const webStorage = new WebStorage(storageName as 'session' | 'local');
21+
22+
const storage = storageType as Storage;
1123

1224
beforeEach(() => {
1325
storage.clear();
1426
});
15-
describe(`main API with ${storageName}`, () => {
16-
it(`gets single item from ${storage}`, async () => {
17-
storage.setItem('key1', 'value1');
18-
expect(await webStorage.getSingle('key1')).toBe('value1');
19-
});
2027

21-
it(`saves single item to ${storageName}`, async () => {
22-
await webStorage.setSingle('key1', 'value1');
23-
expect(storage.__STORE__.key1).toBe('value1');
24-
});
28+
it('gets single item', async () => {
29+
storage.setItem('key1', 'value1');
30+
expect(await webStorage.getSingle('key1')).toBe('value1');
31+
});
2532

26-
it(`gets multiple items from ${storageName}`, async () => {
27-
storage.setItem('key1', 'value1');
28-
storage.setItem('key2', 'value2');
29-
expect(await webStorage.getMany(['key1', 'key2'])).toEqual({
30-
key1: 'value1',
31-
key2: 'value2',
32-
});
33-
});
33+
it('sets single item', async () => {
34+
await webStorage.setSingle('key1', 'value1');
35+
expect(storage.__STORE__.key1).toBe('value1');
36+
});
3437

35-
it(`saves multiple items to ${storageName}`, async () => {
36-
await webStorage.setMany([{key1: 'value1'}, {key2: 'value2'}]);
37-
expect(storage.__STORE__).toEqual({key1: 'value1', key2: 'value2'});
38+
it('gets multiple items', async () => {
39+
storage.setItem('key1', 'value1');
40+
storage.setItem('key2', 'value2');
41+
expect(await webStorage.getMany(['key1', 'key2'])).toEqual({
42+
key1: 'value1',
43+
key2: 'value2',
3844
});
45+
});
3946

40-
it(`removes single item from ${storageName}`, async () => {
41-
storage.setItem('key1', 'value1');
42-
storage.setItem('key2', 'value2');
43-
await webStorage.removeSingle('key1');
44-
expect(storage.__STORE__).toEqual({key2: 'value2'});
45-
});
47+
it('sets multiple items', async () => {
48+
await webStorage.setMany([{key1: 'value1'}, {key2: 'value2'}]);
49+
expect(storage.__STORE__).toEqual({key1: 'value1', key2: 'value2'});
50+
});
4651

47-
it(`removes multiple items from ${storageName}`, async () => {
48-
storage.setItem('key1', 'value1');
49-
storage.setItem('key2', 'value2');
50-
storage.setItem('key3', 'value3');
51-
await webStorage.removeMany(['key1', 'key2']);
52-
expect(storage.__STORE__).toEqual({key3: 'value3'});
53-
});
52+
it('removes single item', async () => {
53+
storage.setItem('key1', 'value1');
54+
storage.setItem('key2', 'value2');
55+
await webStorage.removeSingle('key1');
56+
expect(storage.__STORE__).toEqual({key2: 'value2'});
57+
});
58+
59+
it('removes multiple items', async () => {
60+
storage.setItem('key1', 'value1');
61+
storage.setItem('key2', 'value2');
62+
storage.setItem('key3', 'value3');
63+
await webStorage.removeMany(['key1', 'key2']);
64+
expect(storage.__STORE__).toEqual({key3: 'value3'});
65+
});
66+
67+
it('gets used keys', async () => {
68+
storage.setItem('key1', 'value1');
69+
storage.setItem('key2', 'value2');
70+
expect(await webStorage.getKeys()).toEqual(['key1', 'key2']);
71+
});
72+
73+
it('purges storage', async () => {
74+
storage.setItem('key1', 'value1');
75+
storage.setItem('key2', 'value2');
76+
await webStorage.dropStorage();
77+
expect(storage.__STORE__).toEqual({});
78+
});
79+
});
5480

55-
it(`gets keys from ${storageName}`, async () => {
56-
storage.setItem('key1', 'value1');
57-
storage.setItem('key2', 'value2');
58-
expect(await webStorage.getKeys()).toEqual(['key1', 'key2']);
81+
describe('idb storage', () => {
82+
beforeEach(() => {
83+
jest.resetAllMocks();
84+
});
85+
const storage = new WebStorage('idb');
86+
87+
it('sets a single data', async () => {
88+
await storage.setSingle('key', 'value');
89+
expect(idbMock.set).toBeCalledTimes(1);
90+
expect(idbMock.set).toBeCalledWith('key', 'value');
91+
});
92+
93+
it('reads a single value', async () => {
94+
await storage.getSingle('key');
95+
expect(idbMock.get).toBeCalledTimes(1);
96+
expect(idbMock.get).toBeCalledWith('key');
97+
});
98+
99+
it('removes a single value', async () => {
100+
await storage.removeSingle('key1');
101+
expect(idbMock.del).toBeCalledTimes(1);
102+
expect(idbMock.del).toBeCalledWith('key1');
103+
});
104+
105+
it('calls storage to save multiple data', async () => {
106+
const keyVals = [{key1: 'value1'}, {key2: {value: [1, 2, 3]}}];
107+
108+
await storage.setMany(keyVals);
109+
expect(idbMock.set).toBeCalledTimes(2);
110+
expect(idbMock.set).toBeCalledWith('key1', 'value1');
111+
expect(idbMock.set).toBeCalledWith('key2', {value: [1, 2, 3]});
112+
});
113+
114+
it('calls storage to read multiple data', async () => {
115+
// @ts-ignore jest mock
116+
idbMock.get.mockImplementation(async (key: string) => {
117+
switch (key) {
118+
case 'key1':
119+
return 'value1';
120+
case 'key2':
121+
return [1, 2, 3];
122+
case 'key3':
123+
return true;
124+
default:
125+
return null;
126+
}
59127
});
60128

61-
it(`removes all keys from ${storageName}`, async () => {
62-
storage.setItem('key1', 'value1');
63-
storage.setItem('key2', 'value2');
64-
await webStorage.dropStorage();
65-
expect(storage.__STORE__).toEqual({});
129+
const values = await storage.getMany(['key1', 'key2', 'key3']);
130+
131+
expect(idbMock.get).toBeCalledTimes(3);
132+
expect(idbMock.get).toBeCalledWith('key1');
133+
expect(idbMock.get).toBeCalledWith('key2');
134+
expect(idbMock.get).toBeCalledWith('key3');
135+
expect(values).toEqual({
136+
key1: 'value1',
137+
key2: [1, 2, 3],
138+
key3: true,
66139
});
67140
});
68-
},
69-
);
141+
142+
it('calls storage to remove multiple data', async () => {
143+
await storage.removeMany(['key1', 'key2', 'key3']);
144+
expect(idbMock.del).toBeCalledTimes(3);
145+
expect(idbMock.del).toBeCalledWith('key1');
146+
expect(idbMock.del).toBeCalledWith('key2');
147+
expect(idbMock.del).toBeCalledWith('key3');
148+
});
149+
150+
it('reads and returns used keys', async () => {
151+
// @ts-ignore jest-mock
152+
idbMock.keys.mockImplementationOnce(async () => ['key1', 'key2', 'key3']);
153+
154+
const usedKeys = await storage.getKeys();
155+
156+
expect(idbMock.keys).toBeCalledTimes(1);
157+
expect(usedKeys).toEqual(['key1', 'key2', 'key3']);
158+
});
159+
160+
it('purges storage', async () => {
161+
await storage.dropStorage();
162+
expect(idbMock.clear).toBeCalledTimes(1);
163+
});
164+
});
165+
});

0 commit comments

Comments
 (0)