jest-webextension-mock 3.9.0 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # jest-webextension-mock
2
2
 
3
+ ## 3.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix storage returning undefined for unknown keys
8
+
3
9
  ## 3.9.0
4
10
 
5
11
  ### Minor Changes
@@ -19,32 +19,21 @@ describe('browser.storage', () => {
19
19
  test('a string key', (done) => {
20
20
  const key = 'test';
21
21
  storage.get(key, (result) => {
22
- expect(result).toBeDefined();
23
- expect(typeof result === 'object').toBeTruthy();
24
- expect(result).toHaveProperty(key, undefined);
22
+ expect(result).toStrictEqual({});
25
23
  done();
26
24
  });
27
25
  });
28
26
  test('an array key', (done) => {
29
27
  const keys = ['test1', 'test2'];
30
28
  storage.get(keys, (result) => {
31
- expect(result).toBeDefined();
32
- expect(typeof result === 'object').toBeTruthy();
33
- keys.forEach((k) => {
34
- expect(result).toHaveProperty(k, undefined);
35
- });
29
+ expect(result).toStrictEqual({});
36
30
  done();
37
31
  });
38
32
  });
39
33
  test('an object key', (done) => {
40
34
  const key = { test: [] };
41
35
  storage.get(key, (result) => {
42
- expect(result).toBeDefined();
43
- expect(typeof result === 'object').toBeTruthy();
44
- Object.keys(key).forEach((k) => {
45
- expect(result).toHaveProperty(k);
46
- expect(result[k]).toEqual(key[k]);
47
- });
36
+ expect(result).toStrictEqual({ test: [] });
48
37
  done();
49
38
  });
50
39
  });
@@ -71,8 +60,8 @@ describe('browser.storage', () => {
71
60
  const key = 'key';
72
61
  return expect(storage.get(key)).resolves.toEqual({ key: undefined });
73
62
  });
74
- test('getBytesInUse', (done) => {
75
- const callback = jest.fn(() => done());
63
+ test('getBytesInUse', () => {
64
+ const callback = jest.fn();
76
65
  expect(jest.isMockFunction(storage.getBytesInUse)).toBe(true);
77
66
  storage.getBytesInUse('key', callback);
78
67
  expect(storage.getBytesInUse).toHaveBeenCalledTimes(1);
@@ -81,8 +70,8 @@ describe('browser.storage', () => {
81
70
  test('getBytesInUse promise', () => {
82
71
  return expect(storage.getBytesInUse('key')).resolves.toBe(0);
83
72
  });
84
- test('set', (done) => {
85
- const callback = jest.fn(() => done());
73
+ test('set', () => {
74
+ const callback = jest.fn();
86
75
  expect(jest.isMockFunction(storage.set)).toBe(true);
87
76
  storage.set({ key: 'foo' }, callback);
88
77
  expect(storage.set).toHaveBeenCalledTimes(1);
@@ -91,8 +80,8 @@ describe('browser.storage', () => {
91
80
  test('set promise', () => {
92
81
  return expect(storage.set(1)).resolves.toBeUndefined();
93
82
  });
94
- test('remove', (done) => {
95
- const callback = jest.fn(() => done());
83
+ test('remove', () => {
84
+ const callback = jest.fn();
96
85
  expect(jest.isMockFunction(storage.remove)).toBe(true);
97
86
  storage.remove('key', callback);
98
87
  expect(storage.remove).toHaveBeenCalledTimes(1);
@@ -101,8 +90,8 @@ describe('browser.storage', () => {
101
90
  test('remove promise', () => {
102
91
  return expect(storage.remove(['foo', 'bar'])).resolves.toBeUndefined();
103
92
  });
104
- test('clear', (done) => {
105
- const callback = jest.fn(() => done());
93
+ test('clear', () => {
94
+ const callback = jest.fn();
106
95
  expect(jest.isMockFunction(browser.storage.sync.clear)).toBe(true);
107
96
  storage.clear(callback);
108
97
  expect(storage.clear).toHaveBeenCalledTimes(1);
@@ -120,24 +109,16 @@ describe('browser.storage', () => {
120
109
  storage.set({ key: 'value', foo: 'bar', foo2: 'bar2' }, () => {
121
110
  // get 'key'
122
111
  storage.get(['key'], (result) => {
123
- expect(result).toBeDefined();
124
- expect(typeof result === 'object').toBeTruthy();
125
- expect(result).toHaveProperty('key', 'value');
126
- expect(result).not.toHaveProperty('foo');
127
- expect(result).not.toHaveProperty('foo2');
112
+ expect(result).toStrictEqual({ key: 'value' });
128
113
  // remove 'key'
129
114
  storage.remove('key', () => {
130
115
  // get all values
131
116
  storage.get(null, (result) => {
132
- expect(result).toHaveProperty('key', undefined);
133
- expect(result).toHaveProperty('foo', 'bar');
134
- expect(result).toHaveProperty('foo2', 'bar2');
117
+ expect(result).toStrictEqual({ foo: 'bar', foo2: 'bar2' });
135
118
  // clear values
136
119
  storage.clear(() => {
137
120
  storage.get(['key', 'foo', 'foo2'], (result) => {
138
- expect(result).toHaveProperty('key', undefined);
139
- expect(result).toHaveProperty('foo', undefined);
140
- expect(result).toHaveProperty('foo2', undefined);
121
+ expect(result).toStrictEqual({});
141
122
  done();
142
123
  });
143
124
  });
package/dist/setup.js CHANGED
@@ -43,6 +43,52 @@ function _defineProperty(obj, key, value) {
43
43
  }
44
44
  return obj;
45
45
  }
46
+ function _slicedToArray(arr, i) {
47
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
48
+ }
49
+ function _arrayWithHoles(arr) {
50
+ if (Array.isArray(arr)) return arr;
51
+ }
52
+ function _iterableToArrayLimit(arr, i) {
53
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
54
+ if (_i == null) return;
55
+ var _arr = [];
56
+ var _n = true;
57
+ var _d = false;
58
+ var _s, _e;
59
+ try {
60
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
61
+ _arr.push(_s.value);
62
+ if (i && _arr.length === i) break;
63
+ }
64
+ } catch (err) {
65
+ _d = true;
66
+ _e = err;
67
+ } finally {
68
+ try {
69
+ if (!_n && _i["return"] != null) _i["return"]();
70
+ } finally {
71
+ if (_d) throw _e;
72
+ }
73
+ }
74
+ return _arr;
75
+ }
76
+ function _unsupportedIterableToArray(o, minLen) {
77
+ if (!o) return;
78
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
79
+ var n = Object.prototype.toString.call(o).slice(8, -1);
80
+ if (n === "Object" && o.constructor) n = o.constructor.name;
81
+ if (n === "Map" || n === "Set") return Array.from(o);
82
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
83
+ }
84
+ function _arrayLikeToArray(arr, len) {
85
+ if (len == null || len > arr.length) len = arr.length;
86
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
87
+ return arr2;
88
+ }
89
+ function _nonIterableRest() {
90
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
91
+ }
46
92
 
47
93
  // https://developer.chrome.com/extensions/omnibox
48
94
 
@@ -259,115 +305,34 @@ var createEventListeners = function createEventListeners() {
259
305
  };
260
306
  };
261
307
 
262
- var syncStore = {};
263
- var localStore = {};
264
- var managedStore = {};
265
308
  function resolveKey(key, store) {
266
309
  if (typeof key === 'string') {
267
- var result = {};
268
- result[key] = store[key];
269
- return result;
310
+ if (key in store) {
311
+ return {
312
+ key: store[key]
313
+ };
314
+ } else {
315
+ return {};
316
+ }
270
317
  } else if (Array.isArray(key)) {
271
- return key.reduce(function (acc, curr) {
272
- acc[curr] = store[curr];
273
- return acc;
318
+ return key.reduce(function (acc, currKey) {
319
+ return _objectSpread2(_objectSpread2({}, acc), resolveKey(currKey, store));
274
320
  }, {});
275
321
  } else if (_typeof(key) === 'object') {
276
- return Object.keys(key).reduce(function (acc, curr) {
277
- acc[curr] = store[curr] || key[curr];
278
- return acc;
322
+ return Object.entries(key).reduce(function (acc, _ref) {
323
+ var _ref2 = _slicedToArray(_ref, 2),
324
+ currKey = _ref2[0],
325
+ fallbackValue = _ref2[1];
326
+ return _objectSpread2(_objectSpread2({}, acc), {}, _defineProperty({}, currKey, fallbackValue), resolveKey(currKey, store));
279
327
  }, {});
280
328
  }
281
329
  throw new Error('Wrong key given');
282
330
  }
283
- var storage = {
284
- sync: {
285
- get: jest.fn(function (id, cb) {
286
- var result = id === null || id === undefined ? syncStore : resolveKey(id, syncStore);
287
- if (cb !== undefined) {
288
- return cb(result);
289
- }
290
- return Promise.resolve(result);
291
- }),
292
- getBytesInUse: jest.fn(function (id, cb) {
293
- if (cb !== undefined) {
294
- return cb(0);
295
- }
296
- return Promise.resolve(0);
297
- }),
298
- set: jest.fn(function (payload, cb) {
299
- Object.keys(payload).forEach(function (key) {
300
- return syncStore[key] = payload[key];
301
- });
302
- if (cb !== undefined) {
303
- return cb();
304
- }
305
- return Promise.resolve();
306
- }),
307
- remove: jest.fn(function (id, cb) {
308
- var keys = typeof id === 'string' ? [id] : id;
309
- keys.forEach(function (key) {
310
- return delete syncStore[key];
311
- });
312
- if (cb !== undefined) {
313
- return cb();
314
- }
315
- return Promise.resolve();
316
- }),
317
- clear: jest.fn(function (cb) {
318
- syncStore = {};
319
- if (cb !== undefined) {
320
- return cb();
321
- }
322
- return Promise.resolve();
323
- }),
324
- onChanged: createEventListeners()
325
- },
326
- local: {
327
- get: jest.fn(function (id, cb) {
328
- var result = id === null || id === undefined ? localStore : resolveKey(id, localStore);
329
- if (cb !== undefined) {
330
- return cb(result);
331
- }
332
- return Promise.resolve(result);
333
- }),
334
- getBytesInUse: jest.fn(function (id, cb) {
335
- if (cb !== undefined) {
336
- return cb(0);
337
- }
338
- return Promise.resolve(0);
339
- }),
340
- set: jest.fn(function (payload, cb) {
341
- Object.keys(payload).forEach(function (key) {
342
- return localStore[key] = payload[key];
343
- });
344
- if (cb !== undefined) {
345
- return cb();
346
- }
347
- return Promise.resolve();
348
- }),
349
- remove: jest.fn(function (id, cb) {
350
- var keys = typeof id === 'string' ? [id] : id;
351
- keys.forEach(function (key) {
352
- return delete localStore[key];
353
- });
354
- if (cb !== undefined) {
355
- return cb();
356
- }
357
- return Promise.resolve();
358
- }),
359
- clear: jest.fn(function (cb) {
360
- localStore = {};
361
- if (cb !== undefined) {
362
- return cb();
363
- }
364
- return Promise.resolve();
365
- }),
366
- onChanged: createEventListeners()
367
- },
368
- session: {
331
+ function mockStore() {
332
+ var store = {};
333
+ return {
369
334
  get: jest.fn(function (id, cb) {
370
- var result = id === null || id === undefined ? localStore : resolveKey(id, localStore);
335
+ var result = id === null || id === undefined ? store : resolveKey(id, store);
371
336
  if (cb !== undefined) {
372
337
  return cb(result);
373
338
  }
@@ -381,7 +346,7 @@ var storage = {
381
346
  }),
382
347
  set: jest.fn(function (payload, cb) {
383
348
  Object.keys(payload).forEach(function (key) {
384
- return localStore[key] = payload[key];
349
+ return store[key] = payload[key];
385
350
  });
386
351
  if (cb !== undefined) {
387
352
  return cb();
@@ -391,7 +356,7 @@ var storage = {
391
356
  remove: jest.fn(function (id, cb) {
392
357
  var keys = typeof id === 'string' ? [id] : id;
393
358
  keys.forEach(function (key) {
394
- return delete localStore[key];
359
+ return delete store[key];
395
360
  });
396
361
  if (cb !== undefined) {
397
362
  return cb();
@@ -399,56 +364,22 @@ var storage = {
399
364
  return Promise.resolve();
400
365
  }),
401
366
  clear: jest.fn(function (cb) {
402
- localStore = {};
403
- if (cb !== undefined) {
404
- return cb();
405
- }
406
- return Promise.resolve();
407
- }),
408
- onChanged: createEventListeners()
409
- },
410
- managed: {
411
- get: jest.fn(function (id, cb) {
412
- var result = id === null || id === undefined ? managedStore : resolveKey(id, managedStore);
413
- if (cb !== undefined) {
414
- return cb(result);
415
- }
416
- return Promise.resolve(result);
417
- }),
418
- getBytesInUse: jest.fn(function (id, cb) {
419
- if (cb !== undefined) {
420
- return cb(0);
421
- }
422
- return Promise.resolve(0);
423
- }),
424
- set: jest.fn(function (payload, cb) {
425
- Object.keys(payload).forEach(function (key) {
426
- return managedStore[key] = payload[key];
367
+ Object.keys(store).forEach(function (key) {
368
+ return delete store[key];
427
369
  });
428
370
  if (cb !== undefined) {
429
371
  return cb();
430
372
  }
431
373
  return Promise.resolve();
432
374
  }),
433
- remove: jest.fn(function (id, cb) {
434
- var keys = typeof id === 'string' ? [id] : id;
435
- keys.forEach(function (key) {
436
- return delete managedStore[key];
437
- });
438
- if (cb !== undefined) {
439
- return cb();
440
- }
441
- return Promise.resolve();
442
- }),
443
- clear: jest.fn(function (cb) {
444
- managedStore = {};
445
- if (cb !== undefined) {
446
- return cb();
447
- }
448
- return Promise.resolve();
449
- }),
450
375
  onChanged: createEventListeners()
451
- },
376
+ };
377
+ }
378
+ var storage = {
379
+ sync: mockStore(),
380
+ local: mockStore(),
381
+ session: mockStore(),
382
+ managed: mockStore(),
452
383
  onChanged: createEventListeners()
453
384
  };
454
385
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jest-webextension-mock",
3
- "version": "3.9.0",
3
+ "version": "3.9.1",
4
4
  "description": "Mock the components of a WebExtension",
5
5
  "main": "dist/setup.js",
6
6
  "module": "src/setup.js",
package/src/storage.js CHANGED
@@ -1,157 +1,40 @@
1
1
  import { createEventListeners } from './createEventListeners';
2
2
 
3
- let syncStore = {};
4
- let localStore = {};
5
- let managedStore = {};
6
- let sessionStore = {};
7
-
8
3
  function resolveKey(key, store) {
9
4
  if (typeof key === 'string') {
10
- const result = {};
11
- result[key] = store[key];
12
- return result;
5
+ if (key in store) {
6
+ return { key: store[key] };
7
+ } else {
8
+ return {};
9
+ }
13
10
  } else if (Array.isArray(key)) {
14
- return key.reduce((acc, curr) => {
15
- acc[curr] = store[curr];
16
- return acc;
17
- }, {});
11
+ return key.reduce(
12
+ (acc, currKey) => ({
13
+ ...acc,
14
+ ...resolveKey(currKey, store),
15
+ }),
16
+ {}
17
+ );
18
18
  } else if (typeof key === 'object') {
19
- return Object.keys(key).reduce((acc, curr) => {
20
- acc[curr] = store[curr] || key[curr];
21
- return acc;
22
- }, {});
19
+ return Object.entries(key).reduce(
20
+ (acc, [currKey, fallbackValue]) => ({
21
+ ...acc,
22
+ [currKey]: fallbackValue,
23
+ ...resolveKey(currKey, store),
24
+ }),
25
+ {}
26
+ );
23
27
  }
24
28
  throw new Error('Wrong key given');
25
29
  }
26
30
 
27
- export const storage = {
28
- sync: {
29
- get: jest.fn((id, cb) => {
30
- const result =
31
- id === null || id === undefined ? syncStore : resolveKey(id, syncStore);
32
- if (cb !== undefined) {
33
- return cb(result);
34
- }
35
- return Promise.resolve(result);
36
- }),
37
- getBytesInUse: jest.fn((id, cb) => {
38
- if (cb !== undefined) {
39
- return cb(0);
40
- }
41
- return Promise.resolve(0);
42
- }),
43
- set: jest.fn((payload, cb) => {
44
- Object.keys(payload).forEach((key) => (syncStore[key] = payload[key]));
45
- if (cb !== undefined) {
46
- return cb();
47
- }
48
- return Promise.resolve();
49
- }),
50
- remove: jest.fn((id, cb) => {
51
- const keys = typeof id === 'string' ? [id] : id;
52
- keys.forEach((key) => delete syncStore[key]);
53
- if (cb !== undefined) {
54
- return cb();
55
- }
56
- return Promise.resolve();
57
- }),
58
- clear: jest.fn((cb) => {
59
- syncStore = {};
60
- if (cb !== undefined) {
61
- return cb();
62
- }
63
- return Promise.resolve();
64
- }),
65
- onChanged: createEventListeners(),
66
- },
67
- local: {
68
- get: jest.fn((id, cb) => {
69
- const result =
70
- id === null || id === undefined
71
- ? localStore
72
- : resolveKey(id, localStore);
73
- if (cb !== undefined) {
74
- return cb(result);
75
- }
76
- return Promise.resolve(result);
77
- }),
78
- getBytesInUse: jest.fn((id, cb) => {
79
- if (cb !== undefined) {
80
- return cb(0);
81
- }
82
- return Promise.resolve(0);
83
- }),
84
- set: jest.fn((payload, cb) => {
85
- Object.keys(payload).forEach((key) => (localStore[key] = payload[key]));
86
- if (cb !== undefined) {
87
- return cb();
88
- }
89
- return Promise.resolve();
90
- }),
91
- remove: jest.fn((id, cb) => {
92
- const keys = typeof id === 'string' ? [id] : id;
93
- keys.forEach((key) => delete localStore[key]);
94
- if (cb !== undefined) {
95
- return cb();
96
- }
97
- return Promise.resolve();
98
- }),
99
- clear: jest.fn((cb) => {
100
- localStore = {};
101
- if (cb !== undefined) {
102
- return cb();
103
- }
104
- return Promise.resolve();
105
- }),
106
- onChanged: createEventListeners(),
107
- },
108
- session: {
109
- get: jest.fn((id, cb) => {
110
- const result =
111
- id === null || id === undefined
112
- ? localStore
113
- : resolveKey(id, localStore);
114
- if (cb !== undefined) {
115
- return cb(result);
116
- }
117
- return Promise.resolve(result);
118
- }),
119
- getBytesInUse: jest.fn((id, cb) => {
120
- if (cb !== undefined) {
121
- return cb(0);
122
- }
123
- return Promise.resolve(0);
124
- }),
125
- set: jest.fn((payload, cb) => {
126
- Object.keys(payload).forEach((key) => (localStore[key] = payload[key]));
127
- if (cb !== undefined) {
128
- return cb();
129
- }
130
- return Promise.resolve();
131
- }),
132
- remove: jest.fn((id, cb) => {
133
- const keys = typeof id === 'string' ? [id] : id;
134
- keys.forEach((key) => delete localStore[key]);
135
- if (cb !== undefined) {
136
- return cb();
137
- }
138
- return Promise.resolve();
139
- }),
140
- clear: jest.fn((cb) => {
141
- localStore = {};
142
- if (cb !== undefined) {
143
- return cb();
144
- }
145
- return Promise.resolve();
146
- }),
147
- onChanged: createEventListeners(),
148
- },
149
- managed: {
31
+ function mockStore() {
32
+ const store = {};
33
+
34
+ return {
150
35
  get: jest.fn((id, cb) => {
151
36
  const result =
152
- id === null || id === undefined
153
- ? managedStore
154
- : resolveKey(id, managedStore);
37
+ id === null || id === undefined ? store : resolveKey(id, store);
155
38
  if (cb !== undefined) {
156
39
  return cb(result);
157
40
  }
@@ -164,7 +47,7 @@ export const storage = {
164
47
  return Promise.resolve(0);
165
48
  }),
166
49
  set: jest.fn((payload, cb) => {
167
- Object.keys(payload).forEach((key) => (managedStore[key] = payload[key]));
50
+ Object.keys(payload).forEach((key) => (store[key] = payload[key]));
168
51
  if (cb !== undefined) {
169
52
  return cb();
170
53
  }
@@ -172,20 +55,27 @@ export const storage = {
172
55
  }),
173
56
  remove: jest.fn((id, cb) => {
174
57
  const keys = typeof id === 'string' ? [id] : id;
175
- keys.forEach((key) => delete managedStore[key]);
58
+ keys.forEach((key) => delete store[key]);
176
59
  if (cb !== undefined) {
177
60
  return cb();
178
61
  }
179
62
  return Promise.resolve();
180
63
  }),
181
64
  clear: jest.fn((cb) => {
182
- managedStore = {};
65
+ Object.keys(store).forEach((key) => delete store[key]);
183
66
  if (cb !== undefined) {
184
67
  return cb();
185
68
  }
186
69
  return Promise.resolve();
187
70
  }),
188
71
  onChanged: createEventListeners(),
189
- },
72
+ };
73
+ }
74
+
75
+ export const storage = {
76
+ sync: mockStore(),
77
+ local: mockStore(),
78
+ session: mockStore(),
79
+ managed: mockStore(),
190
80
  onChanged: createEventListeners(),
191
81
  };