From db0e8e20453390781a138095170c3fe00d470784 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 6 Aug 2024 20:14:19 +0200 Subject: [PATCH] fixup! test_runner: refactor `mock_loader` --- test/parallel/test-runner-module-mocking.js | 44 +++++++++++++++------ 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/test/parallel/test-runner-module-mocking.js b/test/parallel/test-runner-module-mocking.js index 7e59c0d4dcde8b..f7601730ec7298 100644 --- a/test/parallel/test-runner-module-mocking.js +++ b/test/parallel/test-runner-module-mocking.js @@ -10,7 +10,7 @@ const fixtures = require('../common/fixtures'); const assert = require('node:assert'); const { relative } = require('node:path'); const { test } = require('node:test'); -const { fileURLToPath, pathToFileURL } = require('node:url'); +const { pathToFileURL } = require('node:url'); test('input validation', async (t) => { await t.test('throws if specifier is not a string', (t) => { @@ -514,7 +514,7 @@ test('CJS mocks can be used by both module systems', async (t) => { const cjsMock = t.mock.module(cjsFixture, { namedExports: { fn() { return 42; } }, }); - let esmImpl = await import(pathToFileURL(cjsFixture)); + let esmImpl = await import(cjsFixture); let cjsImpl = require(cjsFixture); assert.strictEqual(esmImpl.fn(), 42); @@ -522,13 +522,33 @@ test('CJS mocks can be used by both module systems', async (t) => { cjsMock.restore(); - esmImpl = await import(pathToFileURL(cjsFixture)); + esmImpl = await import(cjsFixture); cjsImpl = require(cjsFixture); assert.strictEqual(esmImpl.default.string, 'original cjs string'); assert.strictEqual(cjsImpl.string, 'original cjs string'); }); +test('ESM mocks can be used by both module systems', async (t) => { + const esmFixture = fixtures.path('module-mocking', 'basic-esm.mjs'); + const esmMock = t.mock.module(esmFixture, { + namedExports: { fn() { return 42; } }, + }); + + let cjsImpl = require(esmFixture); + let esmImpl = await import(esmFixture); + + assert.strictEqual(cjsImpl.fn(), 42); + assert.strictEqual(esmImpl.fn(), 42); + + esmMock.restore(); + cjsImpl = require(esmFixture); + esmImpl = await import(esmFixture); + + assert.strictEqual(esmImpl.string, 'original esm string'); + assert.strictEqual(cjsImpl.string, 'original esm string'); +}); + test('relative paths can be used by both module systems', async (t) => { const fixture = relative( __dirname, fixtures.path('module-mocking', 'basic-esm.mjs') @@ -566,7 +586,9 @@ test('node_modules can be used by both module systems', async (t) => { }); test('file:// imports are supported in ESM only', async (t) => { - const fixture = fixtures.fileURL('module-mocking', 'basic-esm.mjs').href; + const fixture = pathToFileURL( + fixtures.path('module-mocking', 'basic-esm.mjs') + ).href; const mock = t.mock.module(fixture, { namedExports: { fn() { return 42; } }, }); @@ -582,9 +604,9 @@ test('file:// imports are supported in ESM only', async (t) => { }); test('mocked modules do not impact unmocked modules', async (t) => { - const mockedFixture = fixtures.fileURL('module-mocking', 'basic-cjs.js'); - const unmockedFixture = fixtures.fileURL('module-mocking', 'basic-esm.mjs'); - t.mock.module(`${mockedFixture}`, { + const mockedFixture = fixtures.path('module-mocking', 'basic-cjs.js'); + const unmockedFixture = fixtures.path('module-mocking', 'basic-esm.mjs'); + t.mock.module(mockedFixture, { namedExports: { fn() { return 42; } }, }); const mockedImpl = await import(mockedFixture); @@ -603,18 +625,18 @@ test('defaultExports work with CJS mocks in both module systems', async (t) => { assert.strictEqual(original.string, 'original cjs string'); t.mock.module(fixture, { defaultExport }); assert.strictEqual(require(fixture), defaultExport); - assert.strictEqual((await import(pathToFileURL(fixture))).default, defaultExport); + assert.strictEqual((await import(fixture)).default, defaultExport); }); test('defaultExports work with ESM mocks in both module systems', async (t) => { - const fixture = fixtures.fileURL('module-mocking', 'basic-esm.mjs'); + const fixture = fixtures.path('module-mocking', 'basic-esm.mjs'); const original = await import(fixture); const defaultExport = Symbol('default'); assert.strictEqual(original.string, 'original esm string'); - t.mock.module(`${fixture}`, { defaultExport }); + t.mock.module(fixture, { defaultExport }); assert.strictEqual((await import(fixture)).default, defaultExport); - assert.strictEqual(require(fileURLToPath(fixture)), defaultExport); + assert.strictEqual(require(fixture), defaultExport); }); test('wrong import syntax should throw error after module mocking.', async () => {