Home

Awesome

WebExtensions API Mock

Automatically generated sinon stubs, together with types, for the WebExtensions API. Currently based on the Firefox version 72.0.2 schema. Comes with an API and CLI that lets you update the schema and types to the latest stable Firefox version, thanks to webextensions-schema.

To get globally declared window.browser types for production code I'd recommened installing @types/firefox-webext-browser, those are automatically generated by jsmnbom/definitelytyped-firefox-webext-browser

Install

npm install --save-dev sinon webextensions-api-mock

Important: sinon is a peer dependency, so you have to install it yourself. That's because it can otherwise lead to unexpected assertion behavior when sinon does instanceof checks internally. It also allows to upgrade sinon without the need to bump the version in webextensions-api-mock.

Usage

import browserMock from 'webextensions-api-mock';
// or
// const { default: browserMock } = require('webextensions-api-mock');

const browser = browserMock();

All browser methods are now sinon stubs and hence you can use them as usual in your test, e.g. if your production code calls browser.tabs.create() you can assert it

assert(browser.tabs.create.called);

To trigger event listeners, you can use the yield method on stubs.

browser.tabs.onCreated.addListener.yield();

Every call to browserMock() creates a new browser object based on a new sinon sandbox. The sinon sandbox itself is exposed as sinonSandbox property on the browser object. So to e.g. reset the history of all browser stubs, you'd call

browser.sinonSandbox.resetHistory();

Update schema and types

Update the schema and types to the latest available stable Firefox version. Feel free to PR updated schema and types if they're not up-to-date.

Using API

import { update } from 'webextensions-api-mock';
// or
// const { update } = require('webextensions-api-mock');

(async () => {
  await update();
})();

Using CLI

webextensions-api-mock update