jest-webextension-mock 3.8.8 → 3.8.11

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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  [![npm](https://img.shields.io/npm/v/jest-webextension-mock.svg)](https://www.npmjs.com/package/jest-webextension-mock) [![npm](https://img.shields.io/npm/l/jest-webextension-mock.svg)](https://github.com/clarkbw/jest-webextension-mock/blob/master/LICENSE) [![Codecov](https://img.shields.io/codecov/c/github/clarkbw/jest-webextension-mock.svg)](https://codecov.io/gh/clarkbw/jest-webextension-mock) [![Greenkeeper badge](https://badges.greenkeeper.io/clarkbw/jest-webextension-mock.svg)](https://greenkeeper.io/) [![Twitter](https://img.shields.io/twitter/url/https/github.com/clarkbw/jest-webextension-mock.svg?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=%5Bobject%20Object%5D)
2
2
 
3
+ 💪 @RickyMarou is an official maintainer. This change was made on `2024-04-12` as @clarkbw has not been able to devote sufficient time necessary for this project.
4
+
3
5
  ## Install
4
6
 
5
7
  For npm:
@@ -0,0 +1,39 @@
1
+ test('chrome.permissions.contains', () => {
2
+ expect(jest.isMockFunction(chrome.permissions.contains)).toBe(true);
3
+ chrome.permissions.contains({ permissions: ['tabs'] }, () => {});
4
+ expect(chrome.permissions.contains).toBeCalled();
5
+ });
6
+
7
+ test('chrome.permissions.getAll', () => {
8
+ expect(jest.isMockFunction(chrome.permissions.getAll)).toBe(true);
9
+ chrome.permissions.getAll(() => {});
10
+ expect(chrome.permissions.getAll).toBeCalled();
11
+ });
12
+
13
+ test('chrome.permissions.remove', () => {
14
+ expect(jest.isMockFunction(chrome.permissions.remove)).toBe(true);
15
+ chrome.permissions.remove({ permissions: ['tabs'] }, () => {});
16
+ expect(chrome.permissions.remove).toBeCalled();
17
+ });
18
+
19
+ test('chrome.permissions.request', () => {
20
+ expect(jest.isMockFunction(chrome.permissions.request)).toBe(true);
21
+ chrome.permissions.request({ permissions: ['tabs'] }, () => {});
22
+ expect(chrome.permissions.request).toBeCalled();
23
+ });
24
+
25
+ test('chrome.permissions.onAdded.addListener', () => {
26
+ expect(jest.isMockFunction(chrome.permissions.onAdded.addListener)).toBe(
27
+ true
28
+ );
29
+ chrome.permissions.onAdded.addListener(() => {});
30
+ expect(chrome.permissions.onAdded.addListener).toBeCalled();
31
+ });
32
+
33
+ test('chrome.permissions.onRemoved.addListener', () => {
34
+ expect(jest.isMockFunction(chrome.permissions.onRemoved.addListener)).toBe(
35
+ true
36
+ );
37
+ chrome.permissions.onRemoved.addListener(() => {});
38
+ expect(chrome.permissions.onRemoved.addListener).toBeCalled();
39
+ });
@@ -29,9 +29,10 @@ describe('browser.runtime', () => {
29
29
  });
30
30
  test('getURL', () => {
31
31
  const path = 'TEST_PATH';
32
+ const extensionOriginURL = globalThis[Symbol.for('jest-webextension-mock')].extensionPath;
32
33
  expect(jest.isMockFunction(browser.runtime.getURL)).toBe(true);
33
34
  const respPath = browser.runtime.getURL(path);
34
- expect(respPath).toEqual(path);
35
+ expect(respPath).toEqual(extensionOriginURL + path);
35
36
  expect(browser.runtime.getURL).toHaveBeenCalledTimes(1);
36
37
  });
37
38
  test('sendMessage', (done) => {
package/dist/setup.js CHANGED
@@ -1,6 +1,51 @@
1
1
  'use strict';
2
2
 
3
+ function ownKeys(object, enumerableOnly) {
4
+ var keys = Object.keys(object);
5
+ if (Object.getOwnPropertySymbols) {
6
+ var symbols = Object.getOwnPropertySymbols(object);
7
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
8
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
9
+ })), keys.push.apply(keys, symbols);
10
+ }
11
+ return keys;
12
+ }
13
+ function _objectSpread2(target) {
14
+ for (var i = 1; i < arguments.length; i++) {
15
+ var source = null != arguments[i] ? arguments[i] : {};
16
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
17
+ _defineProperty(target, key, source[key]);
18
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
19
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
20
+ });
21
+ }
22
+ return target;
23
+ }
24
+ function _typeof(obj) {
25
+ "@babel/helpers - typeof";
26
+
27
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
28
+ return typeof obj;
29
+ } : function (obj) {
30
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
31
+ }, _typeof(obj);
32
+ }
33
+ function _defineProperty(obj, key, value) {
34
+ if (key in obj) {
35
+ Object.defineProperty(obj, key, {
36
+ value: value,
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true
40
+ });
41
+ } else {
42
+ obj[key] = value;
43
+ }
44
+ return obj;
45
+ }
46
+
3
47
  // https://developer.chrome.com/extensions/omnibox
48
+
4
49
  var omnibox = {
5
50
  setDefaultSuggestion: jest.fn(),
6
51
  onInputStarted: {
@@ -40,11 +85,9 @@ var runtime = {
40
85
  onMessageListeners.forEach(function (listener) {
41
86
  return listener(message);
42
87
  });
43
-
44
88
  if (cb !== undefined) {
45
89
  return cb();
46
90
  }
47
-
48
91
  return Promise.resolve();
49
92
  }),
50
93
  onMessage: {
@@ -84,7 +127,8 @@ var runtime = {
84
127
  hasListener: jest.fn()
85
128
  },
86
129
  getURL: jest.fn(function (path) {
87
- return path;
130
+ var origin = globalThis[Symbol["for"]('jest-webextension-mock')].extensionPath;
131
+ return String(new URL(path, origin));
88
132
  }),
89
133
  openOptionsPage: jest.fn(),
90
134
  getManifest: jest.fn(function () {
@@ -115,25 +159,22 @@ var tabs = {
115
159
  onMessage: {
116
160
  addListener: jest.fn()
117
161
  },
118
- postMessage: jest.fn() // TODO: add sender
119
-
162
+ postMessage: jest.fn()
163
+ // TODO: add sender
120
164
  };
121
165
  }),
122
166
  create: jest.fn(function () {
123
167
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
124
168
  var cb = arguments.length > 1 ? arguments[1] : undefined;
125
-
126
169
  if (cb !== undefined) {
127
170
  return cb(props);
128
171
  }
129
-
130
172
  return Promise.resolve(props);
131
173
  }),
132
174
  remove: jest.fn(function (tabIds, cb) {
133
175
  if (cb !== undefined) {
134
176
  return cb();
135
177
  }
136
-
137
178
  return Promise.resolve();
138
179
  }),
139
180
  duplicate: jest.fn(function () {
@@ -178,11 +219,9 @@ var tabs = {
178
219
  onMessageListeners.forEach(function (listener) {
179
220
  return listener(tabId, message);
180
221
  });
181
-
182
222
  if (cb !== undefined) {
183
223
  return cb();
184
224
  }
185
-
186
225
  return Promise.resolve();
187
226
  }),
188
227
  reload: jest.fn(function (tabId, reloadProperties, cb) {
@@ -190,18 +229,7 @@ var tabs = {
190
229
  })
191
230
  };
192
231
 
193
- function _typeof(obj) {
194
- "@babel/helpers - typeof";
195
-
196
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
197
- return typeof obj;
198
- } : function (obj) {
199
- return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
200
- }, _typeof(obj);
201
- }
202
-
203
232
  var store = {};
204
-
205
233
  function resolveKey(key) {
206
234
  if (typeof key === 'string') {
207
235
  var result = {};
@@ -218,37 +246,30 @@ function resolveKey(key) {
218
246
  return acc;
219
247
  }, {});
220
248
  }
221
-
222
249
  throw new Error('Wrong key given');
223
250
  }
224
-
225
251
  var storage = {
226
252
  sync: {
227
253
  get: jest.fn(function (id, cb) {
228
254
  var result = id === null ? store : resolveKey(id);
229
-
230
255
  if (cb !== undefined) {
231
256
  return cb(result);
232
257
  }
233
-
234
258
  return Promise.resolve(result);
235
259
  }),
236
260
  getBytesInUse: jest.fn(function (id, cb) {
237
261
  if (cb !== undefined) {
238
262
  return cb(0);
239
263
  }
240
-
241
264
  return Promise.resolve(0);
242
265
  }),
243
266
  set: jest.fn(function (payload, cb) {
244
267
  Object.keys(payload).forEach(function (key) {
245
268
  return store[key] = payload[key];
246
269
  });
247
-
248
270
  if (cb !== undefined) {
249
271
  return cb();
250
272
  }
251
-
252
273
  return Promise.resolve();
253
274
  }),
254
275
  remove: jest.fn(function (id, cb) {
@@ -256,49 +277,40 @@ var storage = {
256
277
  keys.forEach(function (key) {
257
278
  return delete store[key];
258
279
  });
259
-
260
280
  if (cb !== undefined) {
261
281
  return cb();
262
282
  }
263
-
264
283
  return Promise.resolve();
265
284
  }),
266
285
  clear: jest.fn(function (cb) {
267
286
  store = {};
268
-
269
287
  if (cb !== undefined) {
270
288
  return cb();
271
289
  }
272
-
273
290
  return Promise.resolve();
274
291
  })
275
292
  },
276
293
  local: {
277
294
  get: jest.fn(function (id, cb) {
278
295
  var result = id === null ? store : resolveKey(id);
279
-
280
296
  if (cb !== undefined) {
281
297
  return cb(result);
282
298
  }
283
-
284
299
  return Promise.resolve(result);
285
300
  }),
286
301
  getBytesInUse: jest.fn(function (id, cb) {
287
302
  if (cb !== undefined) {
288
303
  return cb(0);
289
304
  }
290
-
291
305
  return Promise.resolve(0);
292
306
  }),
293
307
  set: jest.fn(function (payload, cb) {
294
308
  Object.keys(payload).forEach(function (key) {
295
309
  return store[key] = payload[key];
296
310
  });
297
-
298
311
  if (cb !== undefined) {
299
312
  return cb();
300
313
  }
301
-
302
314
  return Promise.resolve();
303
315
  }),
304
316
  remove: jest.fn(function (id, cb) {
@@ -306,49 +318,40 @@ var storage = {
306
318
  keys.forEach(function (key) {
307
319
  return delete store[key];
308
320
  });
309
-
310
321
  if (cb !== undefined) {
311
322
  return cb();
312
323
  }
313
-
314
324
  return Promise.resolve();
315
325
  }),
316
326
  clear: jest.fn(function (cb) {
317
327
  store = {};
318
-
319
328
  if (cb !== undefined) {
320
329
  return cb();
321
330
  }
322
-
323
331
  return Promise.resolve();
324
332
  })
325
333
  },
326
334
  managed: {
327
335
  get: jest.fn(function (id, cb) {
328
336
  var result = id === null ? store : resolveKey(id);
329
-
330
337
  if (cb !== undefined) {
331
338
  return cb(result);
332
339
  }
333
-
334
340
  return Promise.resolve(result);
335
341
  }),
336
342
  getBytesInUse: jest.fn(function (id, cb) {
337
343
  if (cb !== undefined) {
338
344
  return cb(0);
339
345
  }
340
-
341
346
  return Promise.resolve(0);
342
347
  }),
343
348
  set: jest.fn(function (payload, cb) {
344
349
  Object.keys(payload).forEach(function (key) {
345
350
  return store[key] = payload[key];
346
351
  });
347
-
348
352
  if (cb !== undefined) {
349
353
  return cb();
350
354
  }
351
-
352
355
  return Promise.resolve();
353
356
  }),
354
357
  remove: jest.fn(function (id, cb) {
@@ -356,20 +359,16 @@ var storage = {
356
359
  keys.forEach(function (key) {
357
360
  return delete store[key];
358
361
  });
359
-
360
362
  if (cb !== undefined) {
361
363
  return cb();
362
364
  }
363
-
364
365
  return Promise.resolve();
365
366
  }),
366
367
  clear: jest.fn(function (cb) {
367
368
  store = {};
368
-
369
369
  if (cb !== undefined) {
370
370
  return cb();
371
371
  }
372
-
373
372
  return Promise.resolve();
374
373
  })
375
374
  },
@@ -384,10 +383,8 @@ var getDetails = function getDetails(details, cb) {
384
383
  if (cb !== undefined) {
385
384
  return cb();
386
385
  }
387
-
388
386
  return Promise.resolve();
389
387
  };
390
-
391
388
  var browserAction = {
392
389
  setTitle: jest.fn(),
393
390
  getTitle: jest.fn(getDetails),
@@ -406,12 +403,12 @@ var browserAction = {
406
403
  };
407
404
 
408
405
  // https://developer.chrome.com/extensions/commands
406
+
409
407
  var commands = {
410
408
  getAll: jest.fn(function (cb) {
411
409
  if (cb !== undefined) {
412
410
  return cb();
413
411
  }
414
-
415
412
  return Promise.resolve();
416
413
  }),
417
414
  onCommand: {
@@ -423,22 +420,17 @@ var cbOrPromise$1 = function cbOrPromise(cb, value) {
423
420
  if (cb !== undefined) {
424
421
  return cb(value);
425
422
  }
426
-
427
423
  return Promise.resolve(value);
428
424
  };
429
-
430
425
  var create = function create(notificationId, options, cb) {
431
426
  if (typeof notificationId !== 'string') {
432
427
  notificationId = 'generated-id';
433
428
  }
434
-
435
429
  if (typeof options === 'function') {
436
430
  cb = options;
437
431
  }
438
-
439
432
  return cbOrPromise$1(cb, notificationId);
440
433
  };
441
-
442
434
  var notifications = {
443
435
  create: jest.fn(create),
444
436
  update: jest.fn(function (notificationId, options, cb) {
@@ -498,10 +490,8 @@ var cbOrPromise = function cbOrPromise(cb, value) {
498
490
  if (cb !== undefined) {
499
491
  return cb(value);
500
492
  }
501
-
502
493
  return Promise.resolve(value);
503
494
  };
504
-
505
495
  var downloads = {
506
496
  acceptDanger: jest.fn(function (downloadId, cb) {
507
497
  return cbOrPromise(cb);
@@ -536,6 +526,20 @@ var downloads = {
536
526
  showDefaultFolder: jest.fn()
537
527
  };
538
528
 
529
+ // https://developer.chrome.com/extensions/permissions
530
+ var permissions = {
531
+ contains: jest.fn(),
532
+ getAll: jest.fn(),
533
+ remove: jest.fn(),
534
+ request: jest.fn(),
535
+ onAdded: {
536
+ addListener: jest.fn()
537
+ },
538
+ onRemoved: {
539
+ addListener: jest.fn()
540
+ }
541
+ };
542
+
539
543
  var geckoProfiler = {
540
544
  stop: jest.fn(function () {
541
545
  return Promise.resolve();
@@ -563,6 +567,9 @@ var geckoProfiler = {
563
567
  }
564
568
  };
565
569
 
570
+ globalThis[Symbol["for"]('jest-webextension-mock')] = _objectSpread2({
571
+ extensionPath: 'moz-extension://8b413e68-1e0d-4cad-b98e-1eb000799783/'
572
+ }, globalThis[Symbol["for"]('jest-webextension-mock')]);
566
573
  var chrome = {
567
574
  omnibox: omnibox,
568
575
  tabs: tabs,
@@ -575,7 +582,8 @@ var chrome = {
575
582
  i18n: i18n,
576
583
  webNavigation: webNavigation,
577
584
  extension: extension,
578
- downloads: downloads
585
+ downloads: downloads,
586
+ permissions: permissions
579
587
  };
580
588
  // Firefox uses 'browser' but aliases it to chrome
581
589
 
@@ -585,14 +593,16 @@ var chrome = {
585
593
  * directly call the module in their `setupFiles` property.
586
594
  */
587
595
  global.chrome = chrome;
588
- global.browser = chrome; // Firefox specific globals
596
+ global.browser = chrome;
597
+
598
+ // Firefox specific globals
589
599
  // if (navigator.userAgent.indexOf('Firefox') !== -1) {
590
600
  // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#exportFunction
591
-
592
601
  global.exportFunction = jest.fn(function (func) {
593
602
  return func;
594
- }); // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#cloneInto
595
-
603
+ });
604
+ // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#cloneInto
596
605
  global.cloneInto = jest.fn(function (obj) {
597
606
  return obj;
598
- }); // }
607
+ });
608
+ // }
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "jest-webextension-mock",
3
- "version": "3.8.8",
3
+ "version": "3.8.11",
4
4
  "description": "Mock the components of a WebExtension",
5
5
  "main": "dist/setup.js",
6
6
  "module": "src/setup.js",
7
- "author": "Bryan Clark <clarkbw@gmail.com> (https://twitter.com/clarkbw)",
7
+ "author": "Marwan Zibaoui <marwan.zibaoui@gmail.com> (https://mas.to/@Rickymarou)",
8
8
  "license": "ISC",
9
9
  "repository": {
10
10
  "type": "git",
11
- "url": "https://github.com/clarkbw/jest-webextension-mock.git"
11
+ "url": "https://github.com/RickyMarou/jest-webextension-mock"
12
12
  },
13
13
  "scripts": {
14
14
  "test": "jest",
package/src/index.js CHANGED
@@ -9,10 +9,16 @@ import { i18n } from './i18n';
9
9
  import { webNavigation } from './webNavigation';
10
10
  import { extension } from './extension';
11
11
  import { downloads } from './downloads';
12
+ import { permissions } from './permissions';
12
13
 
13
14
  // Firefox specific API
14
15
  import { geckoProfiler } from './geckoProfiler';
15
16
 
17
+ globalThis[Symbol.for('jest-webextension-mock')] = {
18
+ extensionPath: 'moz-extension://8b413e68-1e0d-4cad-b98e-1eb000799783/',
19
+ ...globalThis[Symbol.for('jest-webextension-mock')],
20
+ };
21
+
16
22
  const chrome = {
17
23
  omnibox,
18
24
  tabs,
@@ -26,6 +32,7 @@ const chrome = {
26
32
  webNavigation,
27
33
  extension,
28
34
  downloads,
35
+ permissions,
29
36
  };
30
37
 
31
38
  export { chrome };
@@ -0,0 +1,17 @@
1
+ // https://developer.chrome.com/extensions/permissions
2
+
3
+ export let onMessageListeners = [];
4
+ export let onMessageExternalListeners = [];
5
+
6
+ export const permissions = {
7
+ contains: jest.fn(),
8
+ getAll: jest.fn(),
9
+ remove: jest.fn(),
10
+ request: jest.fn(),
11
+ onAdded: {
12
+ addListener: jest.fn(),
13
+ },
14
+ onRemoved: {
15
+ addListener: jest.fn(),
16
+ },
17
+ };
package/src/runtime.js CHANGED
@@ -56,7 +56,8 @@ export const runtime = {
56
56
  hasListener: jest.fn(),
57
57
  },
58
58
  getURL: jest.fn(function (path) {
59
- return path;
59
+ const origin = globalThis[Symbol.for('jest-webextension-mock')].extensionPath;
60
+ return String(new URL(path, origin));
60
61
  }),
61
62
  openOptionsPage: jest.fn(),
62
63
  getManifest: jest.fn(() => ({ manifest_version: 3 })),