fix(testing): only install dependency for the desired --testEnvironment (#15244)

This commit is contained in:
Caleb Ukle 2023-02-28 15:38:01 -06:00 committed by GitHub
parent e8f19d8cb0
commit 2d2804b0c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 72 additions and 8 deletions

View File

@ -21,6 +21,13 @@
"description": "Do not add dependencies to `package.json`.", "description": "Do not add dependencies to `package.json`.",
"x-priority": "internal" "x-priority": "internal"
}, },
"testEnvironment": {
"type": "string",
"enum": ["jsdom", "node", "none"],
"description": "The test environment for jest. This controls which jest-environment-* package is installed",
"default": "jsdom",
"x-priority": "important"
},
"js": { "js": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,

View File

@ -41,7 +41,7 @@
}, },
"testEnvironment": { "testEnvironment": {
"type": "string", "type": "string",
"enum": ["jsdom", "node"], "enum": ["jsdom", "node", "none"],
"description": "The test environment for jest.", "description": "The test environment for jest.",
"default": "jsdom", "default": "jsdom",
"x-priority": "important" "x-priority": "important"

View File

@ -131,6 +131,40 @@ export default {
expect(packageJson.devDependencies['@types/jest']).toBeDefined(); expect(packageJson.devDependencies['@types/jest']).toBeDefined();
expect(packageJson.devDependencies['ts-jest']).toBeDefined(); expect(packageJson.devDependencies['ts-jest']).toBeDefined();
expect(packageJson.devDependencies['ts-node']).toBeDefined(); expect(packageJson.devDependencies['ts-node']).toBeDefined();
expect(packageJson.devDependencies['jest-environment-jsdom']).toBeDefined();
expect(
packageJson.devDependencies['jest-environment-node']
).not.toBeDefined();
});
it('should add dependencies --testEnvironment=node', async () => {
await jestInitGenerator(tree, { testEnvironment: 'node' });
const packageJson = readJson(tree, 'package.json');
expect(packageJson.devDependencies.jest).toBeDefined();
expect(packageJson.devDependencies['@nrwl/jest']).toBeDefined();
expect(packageJson.devDependencies['@types/jest']).toBeDefined();
expect(packageJson.devDependencies['ts-jest']).toBeDefined();
expect(packageJson.devDependencies['ts-node']).toBeDefined();
expect(packageJson.devDependencies['jest-environment-node']).toBeDefined();
expect(
packageJson.devDependencies['jest-environment-jsdom']
).not.toBeDefined();
});
it('should add dependencies --testEnvironment=none', async () => {
await jestInitGenerator(tree, { testEnvironment: 'none' });
const packageJson = readJson(tree, 'package.json');
expect(packageJson.devDependencies.jest).toBeDefined();
expect(packageJson.devDependencies['@nrwl/jest']).toBeDefined();
expect(packageJson.devDependencies['@types/jest']).toBeDefined();
expect(packageJson.devDependencies['ts-jest']).toBeDefined();
expect(packageJson.devDependencies['ts-node']).toBeDefined();
expect(
packageJson.devDependencies['jest-environment-jsdom']
).not.toBeDefined();
expect(
packageJson.devDependencies['jest-environment-node']
).not.toBeDefined();
}); });
it('should make js jest files', async () => { it('should make js jest files', async () => {

View File

@ -33,6 +33,7 @@ const schemaDefaults = {
compiler: 'tsc', compiler: 'tsc',
js: false, js: false,
rootProject: false, rootProject: false,
testEnvironment: 'jsdom',
} as const; } as const;
function generateGlobalConfig(tree: Tree, isJS: boolean) { function generateGlobalConfig(tree: Tree, isJS: boolean) {
@ -146,7 +147,6 @@ function updateDependencies(tree: Tree, options: NormalizedSchema) {
const devDeps = { const devDeps = {
'@nrwl/jest': nxVersion, '@nrwl/jest': nxVersion,
jest: jestVersion, jest: jestVersion,
'jest-environment-jsdom': jestVersion,
// because the default jest-preset uses ts-jest, // because the default jest-preset uses ts-jest,
// jest will throw an error if it's not installed // jest will throw an error if it's not installed
@ -154,6 +154,10 @@ function updateDependencies(tree: Tree, options: NormalizedSchema) {
'ts-jest': tsJestVersion, 'ts-jest': tsJestVersion,
}; };
if (options.testEnvironment !== 'none') {
devDeps[`jest-environment-${options.testEnvironment}`] = jestVersion;
}
if (!options.js) { if (!options.js) {
devDeps['ts-node'] = tsNodeVersion; devDeps['ts-node'] = tsNodeVersion;
devDeps['@types/jest'] = jestTypesVersion; devDeps['@types/jest'] = jestTypesVersion;

View File

@ -2,6 +2,7 @@ export interface JestInitSchema {
compiler?: 'tsc' | 'babel' | 'swc'; compiler?: 'tsc' | 'babel' | 'swc';
js?: boolean; js?: boolean;
skipPackageJson?: boolean; skipPackageJson?: boolean;
testEnvironment?: 'node' | 'jsdom' | 'none';
/** /**
* @deprecated * @deprecated
*/ */

View File

@ -18,6 +18,13 @@
"description": "Do not add dependencies to `package.json`.", "description": "Do not add dependencies to `package.json`.",
"x-priority": "internal" "x-priority": "internal"
}, },
"testEnvironment": {
"type": "string",
"enum": ["jsdom", "node", "none"],
"description": "The test environment for jest. This controls which jest-environment-* package is installed",
"default": "jsdom",
"x-priority": "important"
},
"js": { "js": {
"type": "boolean", "type": "boolean",
"default": false, "default": false,

View File

@ -18,15 +18,13 @@ const schemaDefaults = {
skipSetupFile: false, skipSetupFile: false,
skipSerializers: false, skipSerializers: false,
rootProject: false, rootProject: false,
testEnvironment: 'jsdom',
} as const; } as const;
function normalizeOptions(options: JestProjectSchema) { function normalizeOptions(options: JestProjectSchema) {
if (!options.testEnvironment) { if (!options.testEnvironment) {
options.testEnvironment = 'jsdom'; options.testEnvironment = 'jsdom';
} }
if (options.testEnvironment === 'jsdom') {
options.testEnvironment = '';
}
if (!options.hasOwnProperty('supportTsx')) { if (!options.hasOwnProperty('supportTsx')) {
options.supportTsx = false; options.supportTsx = false;

View File

@ -31,6 +31,11 @@ export function createFiles(tree: Tree, options: JestProjectSchema) {
generateFiles(tree, join(__dirname, filesFolder), projectConfig.root, { generateFiles(tree, join(__dirname, filesFolder), projectConfig.root, {
tmpl: '', tmpl: '',
...options, ...options,
// jsdom is the default
testEnvironment:
options.testEnvironment === 'none' || options.testEnvironment === 'jsdom'
? ''
: options.testEnvironment,
transformer, transformer,
transformerOptions, transformerOptions,
js: !!options.js, js: !!options.js,

View File

@ -7,7 +7,7 @@ export interface JestProjectSchema {
skipSetupFile?: boolean; skipSetupFile?: boolean;
setupFile?: 'angular' | 'web-components' | 'none'; setupFile?: 'angular' | 'web-components' | 'none';
skipSerializers?: boolean; skipSerializers?: boolean;
testEnvironment?: 'node' | 'jsdom' | ''; testEnvironment?: 'node' | 'jsdom' | 'none';
/** /**
* @deprecated use compiler: "babel" instead * @deprecated use compiler: "babel" instead
*/ */

View File

@ -40,7 +40,7 @@
}, },
"testEnvironment": { "testEnvironment": {
"type": "string", "type": "string",
"enum": ["jsdom", "node"], "enum": ["jsdom", "node", "none"],
"description": "The test environment for jest.", "description": "The test environment for jest.",
"default": "jsdom", "default": "jsdom",
"x-priority": "important" "x-priority": "important"

View File

@ -47,7 +47,9 @@ export async function initGenerator(tree: Tree, schema: Schema) {
}) })
); );
if (options.unitTestRunner === 'jest') { if (options.unitTestRunner === 'jest') {
tasks.push(await jestInitGenerator(tree, schema)); tasks.push(
await jestInitGenerator(tree, { ...schema, testEnvironment: 'node' })
);
} }
tasks.push(updateDependencies(tree)); tasks.push(updateDependencies(tree));

View File

@ -49,6 +49,12 @@ describe('lib', () => {
}, },
}, },
}); });
expect(
readJson(tree, 'package.json').devDependencies['jest-environment-jsdom']
).not.toBeDefined();
expect(
readJson(tree, 'package.json').devDependencies['jest-environment-node']
).toBeDefined();
}); });
it('adds srcRootForCompilationRoot', async () => { it('adds srcRootForCompilationRoot', async () => {