@-xun/test-mock-import
Version:
A generic testing utility that wraps require to ensure imports are performed without caching
73 lines (72 loc) • 2.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isolatedImport = isolatedImport;
exports.protectedImportFactory = protectedImportFactory;
var _testMockExit = require("@-xun/test-mock-exit");
var _rejoinder = require("rejoinder");
var _constant = require("./constant.js");
const globalDebug = (0, _rejoinder.createDebugLogger)({
namespace: _constant.globalDebuggerNamespace
});
const globalDebugIsolatedImport = globalDebug.extend('isolated-import');
function isolatedImport(specifier, options) {
let package_;
jest.isolateModules(() => {
package_ = (required => {
const shouldUseDefault = options?.reduceToDefault === true || options?.reduceToDefault !== false && required.__esModule && Object.keys(required).length <= 2;
globalDebugIsolatedImport(`performing isolated import of %O`, specifier);
if (shouldUseDefault === true) {
globalDebugIsolatedImport(`the value of module.default will be returned if it exists`);
} else if (shouldUseDefault === false) {
globalDebugIsolatedImport(`the entire module object will be returned regardless of the presence of module.default`);
} else {
globalDebugIsolatedImport(`the value of module.default will be returned if (1) module.__esModule === true and (2) module.default exists as the only other key in the module object`);
}
return required.default && shouldUseDefault ? required.default : required;
})(require(specifier));
});
return package_;
}
function protectedImportFactory(...[specifier, factoryOptions]) {
return async function ({
expectedExitCode,
reduceToDefault
} = {}) {
let package_ = undefined;
await (0, _testMockExit.withMockedExit)(async ({
exitSpy,
getExitCode
}) => {
let caughtError = undefined;
try {
package_ = await isolatedImport(specifier, {
...factoryOptions,
...(reduceToDefault !== undefined ? {
reduceToDefault
} : {})
});
} catch (error) {
if ((0, _testMockExit.isMockedExitError)(error)) {
caughtError = error;
} else {
throw error;
}
}
if (expectedExitCode !== undefined) {
const exitCode = getExitCode();
const exitSpyWasCalled = !!exitSpy.mock.lastCall;
if (exitCode === undefined || exitSpyWasCalled) {
expect(exitSpy).toHaveBeenCalledWith(expectedExitCode);
}
if (exitCode !== undefined) {
expect(exitCode).toBe(expectedExitCode);
}
} else if (caughtError) {
throw caughtError;
}
});
return package_;
};
}