Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test_runner: mock_loader resolve the cjs and esm formats respectively. #53846

Merged
merged 10 commits into from
Aug 6, 2024
19 changes: 15 additions & 4 deletions lib/test/mock_loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ let debug = require('internal/util/debuglog').debuglog('test_runner', (fn) => {
debug = fn;
});
const { createRequire, isBuiltin } = require('module');
const { defaultGetFormatWithoutErrors } = require('internal/modules/esm/get_format');
const { defaultResolve } = require('internal/modules/esm/resolve');

// TODO(cjihrig): This file should not be exposed publicly, but register() does
// not handle internal loaders. Before marking this API as stable, one of the
Expand Down Expand Up @@ -95,11 +97,20 @@ async function resolve(specifier, context, nextResolve) {
if (isBuiltin(specifier)) {
mockSpecifier = ensureNodeScheme(specifier);
} else {
// TODO(cjihrig): This try...catch should be replaced by defaultResolve(),
// but there are some edge cases that caused the tests to fail on Windows.
let format;

if (context.parentURL) {
format = defaultGetFormatWithoutErrors(pathToFileURL(context.parentURL));
}

try {
const req = createRequire(context.parentURL);
specifier = pathToFileURL(req.resolve(specifier)).href;
if (format === 'module') {
specifier = defaultResolve(specifier, context).url;
aduh95 marked this conversation as resolved.
Show resolved Hide resolved
} else {
specifier = pathToFileURL(
createRequire(context.parentURL).resolve(specifier),
).href;
}
} catch {
const parentURL = normalizeReferrerURL(context.parentURL);
const parsedURL = URL.parse(specifier, parentURL)?.href;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export let string = 'original esm string';
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { mock } from 'node:test';

try {
mock.module?.('Whatever, this is not significant', { namedExports: {} });
} catch {}

const { string } = await import('./basic-esm-without-extension');
console.log(`Found string: ${string}`); // prints 'original esm string'
15 changes: 15 additions & 0 deletions test/parallel/test-runner-module-mocking.js
Original file line number Diff line number Diff line change
Expand Up @@ -638,3 +638,18 @@ test('defaultExports work with ESM mocks in both module systems', async (t) => {
assert.strictEqual((await import(fixture)).default, defaultExport);
assert.strictEqual(require(fixture), defaultExport);
});

test('wrong import syntax should throw error after module mocking.', async () => {
const { stdout, stderr, code } = await common.spawnPromisified(
process.execPath,
[
'--experimental-test-module-mocks',
'--experimental-default-type=module',
fixtures.path('module-mocking/wrong-import-after-module-mocking.js'),
]
);

assert.strictEqual(stdout, '');
assert.match(stderr, /Error \[ERR_MODULE_NOT_FOUND\]: Cannot find module/);
assert.strictEqual(code, 1);
});
Loading