|
1 | 1 | import WebStorage from '../src';
|
2 | 2 | import 'jest-localstorage-mock';
|
| 3 | +import idbMock from 'idb-keyval'; |
3 | 4 |
|
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; |
11 | 23 |
|
12 | 24 | beforeEach(() => {
|
13 | 25 | storage.clear();
|
14 | 26 | });
|
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 |
| - }); |
20 | 27 |
|
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 | + }); |
25 | 32 |
|
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 | + }); |
34 | 37 |
|
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', |
38 | 44 | });
|
| 45 | + }); |
39 | 46 |
|
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 | + }); |
46 | 51 |
|
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 | + }); |
54 | 80 |
|
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 | + } |
59 | 127 | });
|
60 | 128 |
|
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, |
66 | 139 | });
|
67 | 140 | });
|
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