Skip to content

Commit

Permalink
Resolve dynamic dependencies correctly when a mapping exists (#9303)
Browse files Browse the repository at this point in the history
  • Loading branch information
MrJohz authored and SimenB committed Dec 28, 2019
1 parent a2fcda6 commit 9419034
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -63,6 +63,7 @@
- `[jest-reporters]` Make node-notifier an optional dependency ([#8918](https://github.com/facebook/jest/pull/8918))
- `[jest-reporters]` Make all arguments to methods on `BaseReporter` optional ([#9159](https://github.com/facebook/jest/pull/9159))
- `[jest-resolve]`: Set MODULE_NOT_FOUND as error code when module is not resolved from paths ([#8487](https://github.com/facebook/jest/pull/8487))
- `[jest-resolve-dependencies]` Handle dynamic dependencies correctly even when using module maps ([#9303](https://github.com/facebook/jest/pull/9303))
- `[jest-snapshot]` Remove only the added newlines in multiline snapshots ([#8859](https://github.com/facebook/jest/pull/8859))
- `[jest-snapshot]` Distinguish empty string from external snapshot not written ([#8880](https://github.com/facebook/jest/pull/8880))
- `[jest-snapshot]` [**BREAKING**] Distinguish empty string from internal snapshot not written ([#8898](https://github.com/facebook/jest/pull/8898))
Expand Down
17 changes: 17 additions & 0 deletions e2e/__tests__/dynamicRequireDependencies.ts
@@ -0,0 +1,17 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import * as path from 'path';
import {json as runWithJson} from '../runJest';

const dir = path.resolve(__dirname, '../dynamic-require-dependencies');

test('successfully runs tests with dynamic dependencies', () => {
const {json} = runWithJson(dir, ['--findRelatedTests', 'dynamicRequire.js']);
expect(json.success).toBe(true);
expect(json.numTotalTests).toBe(2);
});
16 changes: 16 additions & 0 deletions e2e/dynamic-require-dependencies/__tests__/dynamicRequire.test.js
@@ -0,0 +1,16 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

test('loading a file with a dynamic local require should work', () => {
const {withStandardResolution} = require('../dynamicRequire');
expect(withStandardResolution()).toBe(1);
});

test('loading a file with a dynamic require and custom resolve should work', () => {
const {withCustomResolution} = require('../dynamicRequire');
expect(withCustomResolution()).toBe(1);
});
13 changes: 13 additions & 0 deletions e2e/dynamic-require-dependencies/dynamicRequire.js
@@ -0,0 +1,13 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

const dynamicModuleName = 'source';

module.exports.withStandardResolution = () =>
require(`./${dynamicModuleName}.js`);
module.exports.withCustomResolution = () =>
require(`$asdf/${dynamicModuleName}.js`);
7 changes: 7 additions & 0 deletions e2e/dynamic-require-dependencies/package.json
@@ -0,0 +1,7 @@
{
"jest": {
"moduleNameMapper": {
"^\\$asdf/(.*)$": "<rootDir>/$1"
}
}
}
8 changes: 8 additions & 0 deletions e2e/dynamic-require-dependencies/source.js
@@ -0,0 +1,8 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

module.exports = 1;
Expand Up @@ -5,6 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/

import Resolver = require('jest-resolve');
import {tmpdir} from 'os';
import * as path from 'path';
import {Config} from '@jest/types';
Expand All @@ -15,6 +16,7 @@ import DependencyResolver from '../index';

const maxWorkers = 1;
let dependencyResolver: DependencyResolver;
let runtimeContextResolver: Resolver;
let Runtime;
let config: Config.ProjectConfig;
const cases: Record<string, jest.Mock> = {
Expand All @@ -29,11 +31,13 @@ beforeEach(() => {
config = makeProjectConfig({
cacheDirectory: path.resolve(tmpdir(), 'jest-resolve-dependencies-test'),
moduleDirectories: ['node_modules'],
moduleNameMapper: [['^\\$asdf/(.*)$', '<rootDir>/$1']],
rootDir: '.',
roots: ['./packages/jest-resolve-dependencies'],
});
return Runtime.createContext(config, {maxWorkers, watchman: false}).then(
(runtimeContext: any) => {
runtimeContextResolver = runtimeContext.resolver;
dependencyResolver = new DependencyResolver(
runtimeContext.resolver,
runtimeContext.hasteFS,
Expand Down Expand Up @@ -106,3 +110,18 @@ test('resolves inverse dependencies from available snapshot', () => {
]),
);
});

test('resolves dependencies correctly when dependency resolution fails', () => {
jest.spyOn(runtimeContextResolver, 'resolveModule').mockImplementation(() => {
throw new Error('resolveModule has failed');
});
jest.spyOn(runtimeContextResolver, 'getMockModule').mockImplementation(() => {
throw new Error('getMockModule has failed');
});

const resolved = dependencyResolver.resolve(
path.resolve(__dirname, '__fixtures__', 'file.test.js'),
);

expect(resolved).toEqual([]);
});
8 changes: 6 additions & 2 deletions packages/jest-resolve-dependencies/src/index.ts
Expand Up @@ -58,8 +58,12 @@ class DependencyResolver {
dependency,
options,
);
} catch (e) {
resolvedDependency = this._resolver.getMockModule(file, dependency);
} catch {
try {
resolvedDependency = this._resolver.getMockModule(file, dependency);
} catch {
// leave resolvedDependency as undefined if nothing can be found
}
}

if (resolvedDependency) {
Expand Down

0 comments on commit 9419034

Please sign in to comment.