mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 16:37:23 +00:00
There was only one place where we weren't overriding a function, and the use case there was fairly unique. Knowing that we're dealing with only functions will simplify override and allow us to add features like detecting spurious stubs.
103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
const requires = [];
|
|
const new_globals = new Set();
|
|
let old_globals = {};
|
|
|
|
exports.set_global = function (name, val) {
|
|
if (!(name in old_globals)) {
|
|
if (!(name in global)) {
|
|
new_globals.add(name);
|
|
}
|
|
old_globals[name] = global[name];
|
|
}
|
|
global[name] = val;
|
|
return val;
|
|
};
|
|
|
|
exports.zrequire = function (name, fn) {
|
|
if (fn === undefined) {
|
|
fn = "../../static/js/" + name;
|
|
} else if (/^generated\/|^js\/|^shared\/|^third\//.test(fn)) {
|
|
// FIXME: Stealing part of the NPM namespace is confusing.
|
|
fn = "../../static/" + fn;
|
|
}
|
|
delete require.cache[require.resolve(fn)];
|
|
requires.push(fn);
|
|
return require(fn);
|
|
};
|
|
|
|
exports.clear_zulip_refs = function () {
|
|
/*
|
|
This is a big hammer to make sure
|
|
we are not "borrowing" a transitively
|
|
required module from a previous test.
|
|
This kind of leak can make it seems
|
|
like we've written the second test
|
|
correctly, but it will fail if we
|
|
run it standalone.
|
|
*/
|
|
_.each(require.cache, (_, fn) => {
|
|
if (fn.indexOf("static/") >= 0) {
|
|
if (fn.indexOf("static/templates") < 0) {
|
|
delete require.cache[fn];
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
exports.restore = function () {
|
|
requires.forEach((fn) => {
|
|
delete require.cache[require.resolve(fn)];
|
|
});
|
|
Object.assign(global, old_globals);
|
|
old_globals = {};
|
|
for (const name of new_globals) {
|
|
delete global[name];
|
|
}
|
|
new_globals.clear();
|
|
};
|
|
|
|
exports.stub_out_jquery = function () {
|
|
set_global("$", () => ({
|
|
on() {},
|
|
trigger() {},
|
|
hide() {},
|
|
removeClass() {},
|
|
}));
|
|
$.fn = {};
|
|
$.now = function () {};
|
|
};
|
|
|
|
exports.with_overrides = function (test_function) {
|
|
// This function calls test_function() and passes in
|
|
// a way to override the namespace temporarily.
|
|
|
|
const restore_callbacks = [];
|
|
|
|
const override = function (name, f) {
|
|
if (typeof f !== "function") {
|
|
throw new Error("You can only override with a function.");
|
|
}
|
|
|
|
const parts = name.split(".");
|
|
const module = parts[0];
|
|
const func_name = parts[1];
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(global, module)) {
|
|
throw new Error("you must first use set_global/zrequire for " + module);
|
|
}
|
|
|
|
const old_f = global[module][func_name];
|
|
global[module][func_name] = f;
|
|
|
|
restore_callbacks.push(() => {
|
|
global[module][func_name] = old_f;
|
|
});
|
|
};
|
|
|
|
test_function(override);
|
|
|
|
for (const restore_callback of restore_callbacks) {
|
|
restore_callback();
|
|
}
|
|
};
|