UNPKG

@-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
"use strict"; 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_; }; }