Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(testing): jest 29 support #14701

Merged
merged 13 commits into from
Feb 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 5 additions & 22 deletions e2e/node/src/node.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -422,30 +422,13 @@ describe('nest libraries', function () {
const nestlib = uniq('nestlib');
runCLI(`generate @nrwl/nest:lib ${nestlib}`);

const jestConfigContent = readFile(`libs/${nestlib}/jest.config.ts`);

expect(stripIndents`${jestConfigContent}`).toEqual(
stripIndents`/* eslint-disable */
export default {
displayName: '${nestlib}',
preset: '../../jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/libs/${nestlib}',
};
`
);

const lintResults = runCLI(`lint ${nestlib}`);
expect(lintResults).toContain('All files pass linting.');

const testResults = runCLI(`test ${nestlib}`);
expect(testResults).toContain(
`Successfully ran target test for project ${nestlib}`
);
}, 60000);

it('should be able to generate a nest library w/ service', async () => {
Expand Down
16 changes: 16 additions & 0 deletions packages/angular/migrations.json
Original file line number Diff line number Diff line change
Expand Up @@ -1904,6 +1904,22 @@
"alwaysAddToPackageJson": false
}
}
},
"15.8.0-jest": {
"version": "15.8.0-beta.0",
"requires": {
"@angular-devkit/build-angular": ">=13.0.0 <16.0.0",
"@angular/compiler-cli": ">=13.0.0 <16.0.0",
"@angular/core": ">=13.0.0 <16.0.0",
"@angular/platform-browser-dynamic": ">=13.0.0 <16.0.0",
"jest": "^29.0.0"
barbados-clemens marked this conversation as resolved.
Show resolved Hide resolved
},
"packages": {
"jest-preset-angular": {
"version": "13.0.0",
"alwaysAddToPackageJson": false
}
}
}
}
}
2 changes: 1 addition & 1 deletion packages/angular/src/utils/versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export const postcssUrlVersion = '~10.1.3';
export const autoprefixerVersion = '^10.4.0';
export const tsNodeVersion = '10.9.1';

export const jestPresetAngularVersion = '~12.2.3';
export const jestPresetAngularVersion = '~13.0.0';
export const protractorVersion = '~7.0.0';
export const karmaVersion = '~6.4.0';
export const karmaChromeLauncherVersion = '~3.1.0';
Expand Down
49 changes: 49 additions & 0 deletions packages/jest/migrations.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,18 @@
"cli": "nx",
"description": "Stop hashing jest spec files and config files for build targets and dependent tasks",
"factory": "./src/migrations/update-15-0-0/add-jest-inputs"
},
"update-configs-jest-29": {
"version": "15.8.0-beta.0",
"cli": "nx",
"description": "Update jest configs to support jest 29 changes (https://jestjs.io/docs/upgrading-to-jest29)",
"factory": "./src/migrations/update-15-8-0/update-configs-jest-29"
},
"update-tests-jest-29": {
"version": "15.8.0-beta.0",
"cli": "nx",
"description": "Update jest test files to support jest 29 changes (https://jestjs.io/docs/upgrading-to-jest29)",
"factory": "./src/migrations/update-15-8-0/update-tests-jest-29"
}
},
"packageJsonUpdates": {
Expand Down Expand Up @@ -215,6 +227,43 @@
"addToPackageJson": "devDependencies"
}
}
},
"15.8.0": {
"version": "15.8.0-beta.0",
"packages": {
"jest": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
},
"@types/jest": {
"version": "~29.4.0",
"alwaysAddToPackageJson": false
},
"expect": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
},
"@jest/globals": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
},
"jest-jasmine2": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
},
"jest-environment-jsdom": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
},
"ts-jest": {
"version": "~29.0.5",
"alwaysAddToPackageJson": false
},
"babel-jest": {
"version": "~29.4.1",
"alwaysAddToPackageJson": false
}
}
}
}
}
5 changes: 4 additions & 1 deletion packages/jest/preset/jest-preset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ export const nxPreset = {
moduleFileExtensions: ['ts', 'js', 'mjs', 'html'],
coverageReporters: ['html'],
transform: {
'^.+\\.(ts|js|html)$': 'ts-jest',
'^.+\\.(ts|js|html)$': [
'ts-jest',
{ tsconfig: '<rootDir>/tsconfig.spec.json' },
],
},
testEnvironment: 'jsdom',
/**
Expand Down
5 changes: 3 additions & 2 deletions packages/jest/src/executors/jest/jest.impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ export async function batchJest(
resultOutput +=
'\n\r' +
jestReporterUtils.getResultHeader(
testResult,
testResult as any,
globalConfig as any,
configs[i] as any
);
Expand All @@ -243,7 +243,8 @@ export async function batchJest(
success: aggregatedResults.numFailedTests === 0,
// TODO(caleb): getSummary assumed endTime is Date.now().
// might need to make own method to correctly set the endtime base on tests instead of _now_
terminalOutput: resultOutput + '\n\r\n\r' + getSummary(aggregatedResults),
terminalOutput:
resultOutput + '\n\r\n\r' + getSummary(aggregatedResults as any),
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ export default {
displayName: 'lib1',
preset: '../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
}
},
coverageDirectory: '../../coverage/libs/lib1',
transform: {
'^.+\\\\\\\\.(ts|mjs|js|html)$': 'jest-preset-angular'
'^.+\\\\\\\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\\\\\\\.mjs$)'],
snapshotSerializers: [
Expand All @@ -73,11 +73,6 @@ exports[`jestProject should create a jest.config.ts 1`] = `
export default {
displayName: 'lib1',
preset: '../../jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
}
},
coverageDirectory: '../../coverage/libs/lib1'
};
"
Expand All @@ -89,15 +84,15 @@ export default {
displayName: 'lib1',
preset: '../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
}
},
coverageDirectory: '../../coverage/libs/lib1',
transform: {
'^.+\\\\\\\\.(ts|mjs|js|html)$': 'jest-preset-angular'
'^.+\\\\\\\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\\\\\\\.mjs$)'],
snapshotSerializers: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
<% if(js){ %>module.exports =<% } else{ %>export default<% } %> {
displayName: '<%= project %>',
preset: '<%= offsetFromRoot %>jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
}
},<% if(testEnvironment) { %>
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],<% if(testEnvironment) { %>
testEnvironment: '<%= testEnvironment %>',<% } %>
coverageDirectory: '<%= offsetFromRoot %>coverage/<%= projectRoot %>',
transform: {
'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular'
'^.+\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)']<% if(!skipSerializers) { %>,
snapshotSerializers: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,10 @@
<% if(js){ %>module.exports =<% } else{ %>export default<% } %> {
displayName: '<%= project %>',
preset: '<%= offsetFromRoot %>jest.preset.js',<% if(setupFile !== 'none') { %>
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],<% } %><% if (transformer === 'ts-jest') { %>
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
}
},<% } %><% if(testEnvironment) { %>
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],<% } %><% if(testEnvironment) { %>
testEnvironment: '<%= testEnvironment %>',<% } %><% if(skipSerializers){ %>
transform: {
<% if (supportTsx){ %>'^.+\\.[tj]sx?$'<% } else { %>'^.+\\.[tj]s$'<% } %>: <% if (supportTsx && transformer === '@swc/jest') { %>['<%= transformer %>', { jsc: { transform: { react: { runtime: 'automatic' } } } }]<% } else { %>'<%= transformer %>'<% } %>
<% if (supportTsx){ %>'^.+\\.[tj]sx?$'<% } else { %>'^.+\\.[tj]s$'<% } %>: <% if (transformerOptions) { %>['<%= transformer %>', <%- transformerOptions %>]<% } else { %>'<%= transformer %>'<% } %>
},
<% if (supportTsx) { %>moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],<% } else { %>moduleFileExtensions: ['ts', 'js', 'html'],<% } %><% } %>
coverageDirectory: '<%= offsetFromRoot %>coverage/<%= projectRoot %>'<% if(rootProject){ %>,
Expand Down
30 changes: 4 additions & 26 deletions packages/jest/src/generators/jest-project/jest-project.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,10 @@ describe('jestProject', () => {
} as JestProjectSchema);
const jestConfig = jestConfigObject(tree, 'libs/lib1/jest.config.ts');
expect(jestConfig.transform).toEqual({
'^.+\\.[tj]sx?$': 'ts-jest',
'^.+\\.[tj]sx?$': [
'ts-jest',
{ tsconfig: '<rootDir>/tsconfig.spec.json' },
],
});
});

Expand Down Expand Up @@ -322,21 +325,6 @@ describe('jestProject', () => {
});

describe('--babelJest', () => {
it('should have globals.ts-jest configured when babelJest is false', async () => {
await jestProjectGenerator(tree, {
...defaultOptions,
project: 'lib1',
babelJest: false,
} as JestProjectSchema);
const jestConfig = jestConfigObject(tree, 'libs/lib1/jest.config.ts');

expect(jestConfig.globals).toEqual({
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
},
});
});

it('should generate proper jest.transform when babelJest is true', async () => {
await jestProjectGenerator(tree, {
...defaultOptions,
Expand Down Expand Up @@ -397,11 +385,6 @@ describe('jestProject', () => {
export default {
displayName: 'my-project',
preset: './jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
}
},
coverageDirectory: './coverage/my-project',
testMatch: [
'<rootDir>/src/**/__tests__/**/*.[jt]s?(x)',
Expand Down Expand Up @@ -435,11 +418,6 @@ describe('jestProject', () => {
module.exports = {
displayName: 'my-project',
preset: './jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
}
},
coverageDirectory: './coverage/my-project',
testMatch: [
'<rootDir>/src/**/__tests__/**/*.[jt]s?(x)',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,25 @@ export function createFiles(tree: Tree, options: JestProjectSchema) {
options.setupFile === 'angular' ? '../files-angular' : '../files';

let transformer: string;
let transformerOptions: string | null = null;
if (options.compiler === 'babel' || options.babelJest) {
transformer = 'babel-jest';
} else if (options.compiler === 'swc') {
transformer = '@swc/jest';
if (options.supportTsx) {
transformerOptions =
"{ jsc: { transform: { react: { runtime: 'automatic' } } } }";
}
} else {
transformer = 'ts-jest';
transformerOptions = "{ tsconfig: '<rootDir>/tsconfig.spec.json' }";
}

generateFiles(tree, join(__dirname, filesFolder), projectConfig.root, {
tmpl: '',
...options,
transformer,
transformerOptions,
js: !!options.js,
rootProject: options.rootProject,
projectRoot: options.rootProject ? options.project : projectConfig.root,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,22 @@ const setupDefaults = {
libName: 'lib-one',
setParserOptionsProject: false,
};
const oldConfig = `
module.exports = {
displayName: 'PLACE_HOLDER',
preset: '../../jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
}
},
transform: {
'^.+\\\\.[tj]sx?$': 'ts-jest'
},
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
coverageDirectory: '../../coverage/libs/PLACE_HOLDER'
};
`;

async function libSetUp(tree: Tree, options = setupDefaults) {
jestInitGenerator(tree, {
Expand All @@ -30,12 +46,9 @@ async function libSetUp(tree: Tree, options = setupDefaults) {
`libs/${options.libName}/jest.config.ts`,
`libs/${options.libName}/jest.config.js`
);
const config = tree.read(`libs/${options.libName}/jest.config.js`, 'utf-8');
tree.write(
`libs/${options.libName}/jest.config.js`,
config
.replace(/\/\* eslint-disable \*\//g, '')
.replace(/export default/g, 'module.exports =')
oldConfig.replace(/PLACE_HOLDER/g, options.libName)
);
updateProjectConfiguration(tree, options.libName, {
...readProjectConfiguration(tree, options.libName),
Expand Down
Loading