From 6da28752e300b5460f3f6e1d707e6ea0f56d441e Mon Sep 17 00:00:00 2001 From: grey275 Date: Thu, 12 Sep 2019 15:49:35 -0700 Subject: [PATCH 01/14] add test for including the mocks of dependencies when resolving --- .../__fixtures__/hasMocked/__mocks__/file.js | 9 +++++++++ .../src/__tests__/__fixtures__/hasMocked/file.js | 9 +++++++++ .../src/__tests__/__fixtures__/hasMocked/file.test.js | 9 +++++++++ .../src/__tests__/dependency_resolver.test.ts | 11 +++++++++++ 4 files changed, 38 insertions(+) create mode 100644 packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/__mocks__/file.js create mode 100644 packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.js create mode 100644 packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js diff --git a/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/__mocks__/file.js b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/__mocks__/file.js new file mode 100644 index 000000000000..b64851b9b271 --- /dev/null +++ b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/__mocks__/file.js @@ -0,0 +1,9 @@ +/** + * 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 = jest.fn(); diff --git a/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.js b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.js new file mode 100644 index 000000000000..f7294048510d --- /dev/null +++ b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.js @@ -0,0 +1,9 @@ +/** + * 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 = str => str; diff --git a/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js new file mode 100644 index 000000000000..c6e4163ee57f --- /dev/null +++ b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js @@ -0,0 +1,9 @@ +/** + * 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. + * + */ + +require('./file'); diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index 7efd09980a9e..4317a3d6a7f0 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -58,6 +58,17 @@ test('resolves dependencies for existing path', () => { ]); }); +test('includes the mocks of dependencies as dependencies', () => { + const resolved = dependencyResolver.resolve( + path.resolve(__dirname, '__fixtures__', 'hasMocked', 'file.test.js'), + ); + + expect(resolved).toEqual([ + expect.stringContaining(path.join('hasMocked', 'file.js')), + expect.stringContaining(path.join('hasMocked', '__mocks__', 'file.js')), + ]); +}); + test('resolves dependencies for scoped packages', () => { const resolved = dependencyResolver.resolve( path.resolve(__dirname, '__fixtures__', 'scoped.js'), From 5cce42eea965ed9197d5a06c543bdc048c313ea3 Mon Sep 17 00:00:00 2001 From: grey275 Date: Thu, 12 Sep 2019 15:51:08 -0700 Subject: [PATCH 02/14] include mocks when resolving dependencies --- packages/jest-resolve-dependencies/src/index.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 1a6345e565c9..4000ea51536d 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import * as path from 'path'; import {Config} from '@jest/types'; // eslint-disable-next-line import/no-extraneous-dependencies import {FS as HasteFS} from 'jest-haste-map'; @@ -51,7 +52,9 @@ class DependencyResolver { if (this._resolver.isCoreModule(dependency)) { return acc; } + let resolvedDependency; + let resolvedMockDependency; try { resolvedDependency = this._resolver.resolveModule( file, @@ -59,11 +62,22 @@ class DependencyResolver { options, ); } catch (e) { - resolvedDependency = this._resolver.getMockModule(file, dependency); + resolvedMockDependency = this._resolver.getMockModule(file, dependency); } if (resolvedDependency) { acc.push(resolvedDependency); + + // If we resolve a dependency, then look for a mock dependency + // of the same name in that dependency's directory. + resolvedMockDependency = this._resolver.getMockModule( + path.dirname(resolvedDependency), + path.basename(dependency), + ); + } + + if (resolvedMockDependency) { + acc.push(resolvedMockDependency); } return acc; From 014d4de4668ec8cc3f5401025ef732745253e0ea Mon Sep 17 00:00:00 2001 From: grey275 Date: Thu, 12 Sep 2019 16:27:25 -0700 Subject: [PATCH 03/14] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46792cc676dc..c3f10d6abf8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ - `[jest-environment-jsdom]` [**BREAKING**] Upgrade JSDOM from v11 to v15 ([#8851](https://github.com/facebook/jest/pull/8851)) - `[jest-util]` [**BREAKING**] Remove deprecated exports ([#8863](https://github.com/facebook/jest/pull/8863)) - `[jest-validate]` [**BREAKING**] Use ESM exports ([#8874](https://github.com/facebook/jest/pull/8874)) +- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#8952](https://github.com/facebook/jest/pull/8952)) ### Performance From 4cebe1b8d6d959ed812d3cfb1902646ef458e03e Mon Sep 17 00:00:00 2001 From: grey275 Date: Thu, 12 Sep 2019 16:57:51 -0700 Subject: [PATCH 04/14] put changelog entry in correct category --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3f10d6abf8f..2faf6771fc03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - `[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)) - `[jest-transform]` Properly cache transformed files across tests ([#8890](https://github.com/facebook/jest/pull/8890)) +- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#8952](https://github.com/facebook/jest/pull/8952)) ### Chore & Maintenance @@ -48,7 +49,6 @@ - `[jest-environment-jsdom]` [**BREAKING**] Upgrade JSDOM from v11 to v15 ([#8851](https://github.com/facebook/jest/pull/8851)) - `[jest-util]` [**BREAKING**] Remove deprecated exports ([#8863](https://github.com/facebook/jest/pull/8863)) - `[jest-validate]` [**BREAKING**] Use ESM exports ([#8874](https://github.com/facebook/jest/pull/8874)) -- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#8952](https://github.com/facebook/jest/pull/8952)) ### Performance From d7e327cc99a75813f4ba8dc5ad7df41c33e9d36a Mon Sep 17 00:00:00 2001 From: Pieter Vanderpol Date: Fri, 13 Sep 2019 07:32:34 -0700 Subject: [PATCH 05/14] Use explicit path delimiters when resolving path to fixture file. Co-Authored-By: Simen Bekkhus --- .../src/__tests__/dependency_resolver.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index 4317a3d6a7f0..2412660ad104 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -60,7 +60,7 @@ test('resolves dependencies for existing path', () => { test('includes the mocks of dependencies as dependencies', () => { const resolved = dependencyResolver.resolve( - path.resolve(__dirname, '__fixtures__', 'hasMocked', 'file.test.js'), + path.resolve(__dirname, '__fixtures__/hasMocked/file.test.js'), ); expect(resolved).toEqual([ From 39cb1addfe9313b506ad98c31425949b9b52e68c Mon Sep 17 00:00:00 2001 From: grey275 Date: Fri, 13 Sep 2019 07:39:08 -0700 Subject: [PATCH 06/14] sort changelog entries alphabetically --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2faf6771fc03..7ac88e9f12f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,11 +30,11 @@ - `[jest-leak-detector]` [**BREAKING**] Use `weak-napi` instead of `weak` package ([#8686](https://github.com/facebook/jest/pull/8686)) - `[jest-mock]` Fix for mockReturnValue overriding mockImplementationOnce ([#8398](https://github.com/facebook/jest/pull/8398)) - `[jest-reporters]` Make node-notifer an optional dependency ([#8918](https://github.com/facebook/jest/pull/8918)) +- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#8952](https://github.com/facebook/jest/pull/8952)) - `[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)) - `[jest-transform]` Properly cache transformed files across tests ([#8890](https://github.com/facebook/jest/pull/8890)) -- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#8952](https://github.com/facebook/jest/pull/8952)) ### Chore & Maintenance From 651b27cff090521ae6e1fada3f0221c0e51729bf Mon Sep 17 00:00:00 2001 From: grey275 Date: Fri, 13 Sep 2019 09:04:06 -0700 Subject: [PATCH 07/14] add test for resolving inverse dependencies of mock (#8952) --- .../src/__tests__/dependency_resolver.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index 2412660ad104..f0b2dc019794 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -100,6 +100,19 @@ test('resolves inverse dependencies for existing path', () => { ]); }); +test('resolves inverse dependencies of mock', () => { + const paths = new Set([ + path.resolve(__dirname, '__fixtures__/hasMocked/__mocks__/file.js'), + ]); + const resolved = dependencyResolver.resolveInverse(paths, filter); + + expect(resolved).toEqual([ + expect.stringContaining( + path.join('__tests__', '__fixtures__', 'hasMocked', 'file.test.js'), + ), + ]); +}); + test('resolves inverse dependencies from available snapshot', () => { const paths = new Set([ path.resolve(__dirname, '__fixtures__/file.js'), From 8137d382f0b9a404f8157a8c612e03fdc458fa1b Mon Sep 17 00:00:00 2001 From: grey275 Date: Fri, 13 Sep 2019 09:06:58 -0700 Subject: [PATCH 08/14] when resolving mocks of dependencies, ensure mock is in correct directory --- .../jest-resolve-dependencies/src/index.ts | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 4000ea51536d..28f26a4f5925 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -62,22 +62,37 @@ class DependencyResolver { options, ); } catch (e) { - resolvedMockDependency = this._resolver.getMockModule(file, dependency); + // TODO: This snippet might not be necessary, should be investigated later. + const mockDependency = this._resolver.getMockModule(file, dependency); + mockDependency && acc.push(mockDependency); + return acc; + } + + if (!resolvedDependency) { + return acc; } - if (resolvedDependency) { - acc.push(resolvedDependency); + acc.push(resolvedDependency); + + // If we resolve a dependency, then look for a mock dependency + // of the same name in that dependency's directory. + resolvedMockDependency = this._resolver.getMockModule( + path.dirname(resolvedDependency), + path.basename(dependency), + ); - // If we resolve a dependency, then look for a mock dependency - // of the same name in that dependency's directory. - resolvedMockDependency = this._resolver.getMockModule( + if (resolvedMockDependency) { + const dependencyMockDir = path.join( path.dirname(resolvedDependency), - path.basename(dependency), + '__mocks__', ); - } - if (resolvedMockDependency) { - acc.push(resolvedMockDependency); + resolvedMockDependency = path.resolve(resolvedMockDependency); + + // make sure mock is in the correct directory + if (dependencyMockDir === path.dirname(resolvedMockDependency)) { + acc.push(resolvedMockDependency); + } } return acc; @@ -141,8 +156,9 @@ class DependencyResolver { } const modules: Array = []; for (const file of this._hasteFS.getAbsoluteFileIterator()) { + const res = this.resolve(file, options); modules.push({ - dependencies: this.resolve(file, options), + dependencies: res, file, }); } From 8ad6ac9ed5a0c8825ec64606f4026d314d41a23d Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 14:04:07 +0000 Subject: [PATCH 09/14] Use path.resolve instead of path.join --- packages/jest-resolve-dependencies/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 4492fb5b17ac..268e2d74ee84 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -81,7 +81,7 @@ class DependencyResolver { ); if (resolvedMockDependency) { - const dependencyMockDir = path.join( + const dependencyMockDir = path.resolve( path.dirname(resolvedDependency), '__mocks__', ); From 8fe7d1659ab9c85ab0fc0f7b955b6746089ce813 Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 15:00:21 +0000 Subject: [PATCH 10/14] Test that mocks of node modules are also added as dependencies --- .../__mocks__/fake-node-module.js | 9 +++++++++ .../src/__tests__/__fixtures__/hasMocked/file.test.js | 1 + .../src/__tests__/dependency_resolver.test.ts | 1 + 3 files changed, 11 insertions(+) create mode 100644 packages/jest-resolve-dependencies/__mocks__/fake-node-module.js diff --git a/packages/jest-resolve-dependencies/__mocks__/fake-node-module.js b/packages/jest-resolve-dependencies/__mocks__/fake-node-module.js new file mode 100644 index 000000000000..f7294048510d --- /dev/null +++ b/packages/jest-resolve-dependencies/__mocks__/fake-node-module.js @@ -0,0 +1,9 @@ +/** + * 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 = str => str; diff --git a/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js index c6e4163ee57f..ec2ebbc0a1a4 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js +++ b/packages/jest-resolve-dependencies/src/__tests__/__fixtures__/hasMocked/file.test.js @@ -7,3 +7,4 @@ */ require('./file'); +require('fake-node-module'); diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index cafdc809ebbc..70fe30a8a810 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -69,6 +69,7 @@ test('includes the mocks of dependencies as dependencies', () => { expect(resolved).toEqual([ expect.stringContaining(path.join('hasMocked', 'file.js')), expect.stringContaining(path.join('hasMocked', '__mocks__', 'file.js')), + expect.stringContaining(path.join('__mocks__', 'fake-node-module.js')), ]); }); From 5a75778e68045d9ad24dc2d48836d73f04aaf101 Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 15:00:56 +0000 Subject: [PATCH 11/14] Remove unnecessary path.dirname call --- packages/jest-resolve-dependencies/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 268e2d74ee84..1a321f0a92af 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -76,7 +76,7 @@ class DependencyResolver { // If we resolve a dependency, then look for a mock dependency // of the same name in that dependency's directory. resolvedMockDependency = this._resolver.getMockModule( - path.dirname(resolvedDependency), + resolvedDependency, path.basename(dependency), ); From 4271fa00f1a6d7b01bf082fbc92e70e519f9a957 Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 15:06:59 +0000 Subject: [PATCH 12/14] Add fix to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc4c3c1f8bde..b218d2dea0f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Fixes - `[expect]` Stop modifying the sample in `expect.objectContaining()` ([#10711](https://github.com/facebook/jest/pull/10711)) +- `[jest-resolve-dependencies]` Resolve mocks as dependencies ([#10713](https://github.com/facebook/jest/pull/10713)) ### Chore & Maintenance From 40d748e20d6bf1be77c3ee84fc2023ba6c25c626 Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 15:34:24 +0000 Subject: [PATCH 13/14] Remove unnecessary change --- packages/jest-resolve-dependencies/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 1a321f0a92af..779040371ad8 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -155,9 +155,8 @@ class DependencyResolver { } const modules: Array = []; for (const file of this._hasteFS.getAbsoluteFileIterator()) { - const res = this.resolve(file, options); modules.push({ - dependencies: res, + dependencies: this.resolve(file, options), file, }); } From 8028e600c7dc2e93bd6dad9e89908a42f289d539 Mon Sep 17 00:00:00 2001 From: Brais Pineiro Date: Mon, 26 Oct 2020 15:34:44 +0000 Subject: [PATCH 14/14] Use full path instead of splitting it --- .../src/__tests__/dependency_resolver.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index 70fe30a8a810..3862becf46dd 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -112,7 +112,7 @@ test('resolves inverse dependencies of mock', () => { expect(resolved).toEqual([ expect.stringContaining( - path.join('__tests__', '__fixtures__', 'hasMocked', 'file.test.js'), + path.join('__tests__/__fixtures__/hasMocked/file.test.js'), ), ]); });