GeezerVison is showing github.com — test_runner: support module detection in module mocks · nodejs/node@3000e5d
File treeExpand file treeCollapse file tree Open diff view settings internal/test_runner/mock
Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/test_runner/mock/mock.js +3-1Lines changed: 3 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -513,7 +513,9 @@ class MockTracker { | 513 | 513 | mockSpecifier, caller, null, | 514 | 514 | ); | 515 | 515 | debug('module mock, url = "%s", format = "%s", caller = "%s"', url, format, caller); | 516 | | - validateOneOf(format, 'format', kSupportedFormats); | | 516 | + if (format) { // Format is not yet known for ambiguous files when detection is enabled. | | 517 | + validateOneOf(format, 'format', kSupportedFormats); | | 518 | + } | 517 | 519 | const baseURL = URL.parse(url); | 518 | 520 |
| 519 | 521 | if (!baseURL) { | |
Collapse file Copy file name to clipboardExpand all lines: lib/test/mock_loader.js +14-6Lines changed: 14 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -143,26 +143,34 @@ async function load(url, context, nextLoad) { | 143 | 143 | const baseURL = parsedURL ? parsedURL.href : url; | 144 | 144 | const mock = mocks.get(baseURL); | 145 | 145 |
| | 146 | + const original = await nextLoad(url, context); | 146 | 147 | debug('load hook, mock = %o', mock); | 147 | 148 | if (mock?.active !== true) { | 148 | | - return nextLoad(url); | | 149 | + return original; | 149 | 150 | } | 150 | 151 |
| 151 | 152 | // Treat builtins as commonjs because customization hooks do not allow a | 152 | 153 | // core module to be replaced. | 153 | | - const format = mock.format === 'builtin' ? 'commonjs' : mock.format; | | 154 | + // Also collapse 'commonjs-sync' and 'require-commonjs' to 'commonjs'. | | 155 | + const format = ( | | 156 | + original.format === 'builtin' || | | 157 | + original.format === 'commonjs-sync' || | | 158 | + original.format === 'require-commonjs') ? 'commonjs' : original.format; | 154 | 159 |
| 155 | | - return { | | 160 | + const result = { | 156 | 161 | __proto__: null, | 157 | 162 | format, | 158 | 163 | shortCircuit: true, | 159 | | - source: await createSourceFromMock(mock), | | 164 | + source: await createSourceFromMock(mock, format), | 160 | 165 | }; | | 166 | + | | 167 | + debug('load hook finished, result = %o', result); | | 168 | + return result; | 161 | 169 | } | 162 | 170 |
| 163 | | -async function createSourceFromMock(mock) { | | 171 | +async function createSourceFromMock(mock, format) { | 164 | 172 | // Create mock implementation from provided exports. | 165 | | - const { exportNames, format, hasDefaultExport, url } = mock; | | 173 | + const { exportNames, hasDefaultExport, url } = mock; | 166 | 174 | const useESM = format === 'module'; | 167 | 175 | const source = `${testImportSource(useESM)} | 168 | 176 | if (!$__test.mock._mockExports.has('${url}')) { | |
|