From 12a407f8cbb16b6057cd19bfb26bc5a8fb8c60c8 Mon Sep 17 00:00:00 2001 From: Jonathan Cammisuli Date: Tue, 14 Jul 2020 12:59:38 -0400 Subject: [PATCH] fix(testing): resolve jestconfig and add globals.ts-jest if needed for migration (#3336) * fix(testing): require jest config to resolve it better during migration * fix(testing): require with appRootPath * chore(testing): remove uneeded exports and imports --- packages/jest/index.ts | 5 +- .../update-10-0-0/require-jest-config.ts | 4 ++ .../update-10-0-0/update-jest-configs.spec.ts | 71 +++++++++++-------- .../update-10-0-0/update-jest-configs.ts | 38 +++++----- .../jest-project/files/jest.config.js__tmpl__ | 3 +- 5 files changed, 68 insertions(+), 53 deletions(-) create mode 100644 packages/jest/src/migrations/update-10-0-0/require-jest-config.ts diff --git a/packages/jest/index.ts b/packages/jest/index.ts index a2f8ef738b..27d682ebc8 100644 --- a/packages/jest/index.ts +++ b/packages/jest/index.ts @@ -2,7 +2,4 @@ export { addPropertyToJestConfig, removePropertyFromJestConfig, } from './src/utils/config/update-config'; -export { - jestConfigObjectAst, - jestConfigObject, -} from './src/utils/config/functions'; +export { jestConfigObjectAst } from './src/utils/config/functions'; diff --git a/packages/jest/src/migrations/update-10-0-0/require-jest-config.ts b/packages/jest/src/migrations/update-10-0-0/require-jest-config.ts new file mode 100644 index 0000000000..b96f903f8c --- /dev/null +++ b/packages/jest/src/migrations/update-10-0-0/require-jest-config.ts @@ -0,0 +1,4 @@ +// export so that we can mock this return value +export function getJestObject(path: string) { + return require(path); +} diff --git a/packages/jest/src/migrations/update-10-0-0/update-jest-configs.spec.ts b/packages/jest/src/migrations/update-10-0-0/update-jest-configs.spec.ts index cf5451bbab..8aa6a940d3 100644 --- a/packages/jest/src/migrations/update-10-0-0/update-jest-configs.spec.ts +++ b/packages/jest/src/migrations/update-10-0-0/update-jest-configs.spec.ts @@ -3,45 +3,60 @@ import { SchematicTestRunner } from '@angular-devkit/schematics/testing'; import { createEmptyWorkspace } from '@nrwl/workspace/testing'; import * as path from 'path'; import { serializeJson } from '@nrwl/workspace'; -import { jestConfigObject } from '../../..'; +import { jestConfigObject } from '../../utils/config/functions'; + +import { getJestObject } from './require-jest-config'; +jest.mock('./require-jest-config'); +const getJestObjectMock = getJestObject as jest.Mock; + +const ngJestObject = { + name: 'test-jest', + preset: '../../jest.config.js', + coverageDirectory: '../../coverage/libs/test-jest', + globals: { + 'existing-global': 'test', + }, + snapshotSerializers: [ + 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', + 'jest-preset-angular/build/AngularSnapshotSerializer.js', + 'jest-preset-angular/build/HTMLCommentSerializer.js', + ], +}; + +const reactJestObject = { + name: 'my-react-app', + preset: '../../jest.config.js', + transform: { + '^(?!.*\\\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', + '^.+\\\\.[tj]sx?$': [ + 'babel-jest', + { cwd: __dirname, configFile: './babel-jest.config.json' }, + ], + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], + coverageDirectory: '../../coverage/apps/my-react-app', +}; describe('update 10.0.0', () => { let initialTree: Tree; let schematicRunner: SchematicTestRunner; - const jestConfig = String.raw` - module.exports = { - name: 'test-jest', - preset: '../../jest.config.js', - coverageDirectory: '../../coverage/libs/test-jest', - globals: { - "existing-global": "test" - }, - snapshotSerializers: [ - 'jest-preset-angular/build/AngularNoNgAttributesSnapshotSerializer.js', - 'jest-preset-angular/build/AngularSnapshotSerializer.js', - 'jest-preset-angular/build/HTMLCommentSerializer.js' - ] - } + module.exports = ${JSON.stringify(ngJestObject)} `; const jestConfigReact = String.raw` - module.exports = { - name: 'my-react-app', - preset: '../../jest.config.js', - transform: { - '^(?!.*\\\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', - '^.+\\\\.[tj]sx?$': [ - 'babel-jest', - { cwd: __dirname, configFile: './babel-jest.config.json' } - ] - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], - coverageDirectory: '../../coverage/apps/my-react-app' - } + module.exports = ${JSON.stringify(reactJestObject)} `; beforeEach(() => { + getJestObjectMock.mockImplementation((path: string): any => { + if (path.includes('apps/products')) { + return ngJestObject; + } else if (path.includes('apps/cart')) { + return reactJestObject; + } + }); + initialTree = createEmptyWorkspace(Tree.empty()); initialTree.create('apps/products/jest.config.js', jestConfig); diff --git a/packages/jest/src/migrations/update-10-0-0/update-jest-configs.ts b/packages/jest/src/migrations/update-10-0-0/update-jest-configs.ts index 11e4c93527..8a46b48abd 100644 --- a/packages/jest/src/migrations/update-10-0-0/update-jest-configs.ts +++ b/packages/jest/src/migrations/update-10-0-0/update-jest-configs.ts @@ -11,7 +11,9 @@ import { serializeJson, updateWorkspace, } from '@nrwl/workspace'; -import { addPropertyToJestConfig, jestConfigObject } from '../../..'; +import { addPropertyToJestConfig } from '../../utils/config/update-config'; +import { getJestObject } from './require-jest-config'; +import { appRootPath } from '@nrwl/workspace/src/utils/app-root'; function checkJestPropertyObject(object: unknown): object is object { return object !== null && object !== undefined; @@ -26,10 +28,6 @@ function modifyJestConfig( tsConfig: string, isAngular: boolean ) { - if (setupFile === '') { - return; - } - let globalTsJest: any = { tsConfig, }; @@ -46,24 +44,26 @@ function modifyJestConfig( } try { - const jestObject = jestConfigObject(host, jestConfig); + const jestObject = getJestObject(`${appRootPath}/${jestConfig}`); - // add set up env file - // setupFilesAfterEnv - const existingSetupFiles = jestObject.setupFilesAfterEnv; + if (setupFile !== '') { + // add set up env file + // setupFilesAfterEnv + const existingSetupFiles = jestObject.setupFilesAfterEnv; - let setupFilesAfterEnv: string | string[] = [setupFile]; - if (Array.isArray(existingSetupFiles)) { - setupFilesAfterEnv = setupFile; + let setupFilesAfterEnv: string | string[] = [setupFile]; + if (Array.isArray(existingSetupFiles)) { + setupFilesAfterEnv = setupFile; + } + + addPropertyToJestConfig( + host, + jestConfig, + 'setupFilesAfterEnv', + setupFilesAfterEnv + ); } - addPropertyToJestConfig( - host, - jestConfig, - 'setupFilesAfterEnv', - setupFilesAfterEnv - ); - // check if jest config has babel transform const transformProperty = jestObject.transform; diff --git a/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ b/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ index b34eafb79e..f8357f0a41 100644 --- a/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ +++ b/packages/jest/src/schematics/jest-project/files/jest.config.js__tmpl__ @@ -1,8 +1,7 @@ module.exports = { name: '<%= project %>', preset: '<%= offsetFromRoot %>jest.config.js',<% if(setupFile !== 'none') { %> - setupFilesAfterEnv: ['/src/test-setup.ts'], - <% } %><% if (transformer === 'ts-jest') { %> + setupFilesAfterEnv: ['/src/test-setup.ts'],<% } %><% if (transformer === 'ts-jest') { %> globals: { 'ts-jest': { tsConfig: '/tsconfig.spec.json',<%if (setupFile === 'angular') { %>