mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-01 08:42:13 +00:00
1018577094
# ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D58243 --HG-- extra : moz-landing-system : lando
73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
// Map of mocked modules, keys are absolute URIs for devtools modules such as
|
|
// "resource://devtools/path/to/mod.js, values are objects (anything passed to
|
|
// setMockedModule technically).
|
|
const _mocks = {};
|
|
|
|
/**
|
|
* Retrieve a mocked module matching the provided uri, eg "resource://path/to/file.js".
|
|
*/
|
|
function getMockedModule(uri) {
|
|
return _mocks[uri];
|
|
}
|
|
exports.getMockedModule = getMockedModule;
|
|
|
|
/**
|
|
* Module paths are transparently provided with or without ".js" when using the loader,
|
|
* normalize the user-provided module paths to always have modules ending with ".js".
|
|
*/
|
|
function _getUriForModulePath(modulePath) {
|
|
// Assume js modules and add the .js extension if missing.
|
|
if (!modulePath.endsWith(".js")) {
|
|
modulePath = modulePath + ".js";
|
|
}
|
|
|
|
// Add resource:// scheme if no scheme is specified.
|
|
if (!modulePath.includes("://")) {
|
|
modulePath = "resource://" + modulePath;
|
|
}
|
|
|
|
return modulePath;
|
|
}
|
|
|
|
/**
|
|
* Assign a mock object to the provided module path.
|
|
* @param mock
|
|
* Plain JavaScript object that will implement the expected API for the mocked
|
|
* module.
|
|
* @param modulePath
|
|
* The module path should be the absolute module path, starting with `devtools`:
|
|
* "devtools/client/some-panel/some-module"
|
|
*/
|
|
function setMockedModule(mock, modulePath) {
|
|
const uri = _getUriForModulePath(modulePath);
|
|
_mocks[uri] = new Proxy(mock, {
|
|
get(target, key) {
|
|
if (typeof target[key] === "function") {
|
|
// Functions are wrapped to be able to update the methods during the test, even if
|
|
// the methods were imported with destructuring. For instance:
|
|
// `const { someMethod } = require("devtools/client/shared/my-module");`
|
|
return function() {
|
|
return target[key].apply(target, arguments);
|
|
};
|
|
}
|
|
return target[key];
|
|
},
|
|
});
|
|
}
|
|
exports.setMockedModule = setMockedModule;
|
|
|
|
/**
|
|
* Remove any mock object defined for the provided absolute module path.
|
|
*/
|
|
function removeMockedModule(modulePath) {
|
|
const uri = _getUriForModulePath(modulePath);
|
|
delete _mocks[uri];
|
|
}
|
|
exports.removeMockedModule = removeMockedModule;
|