feat(testing): add static serve target for e2e tests in CI (#15808)

This commit is contained in:
Jack Hsu 2023-03-22 14:53:02 -04:00 committed by GitHub
parent 6100064db9
commit b124b97c36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 103 additions and 3 deletions

View File

@ -44,8 +44,12 @@ describe('file-server', () => {
const ngAppName = uniq('ng-app');
const reactAppName = uniq('react-app');
runCLI(`generate @nrwl/angular:app ${ngAppName} --no-interactive`);
runCLI(`generate @nrwl/react:app ${reactAppName} --no-interactive`);
runCLI(
`generate @nrwl/angular:app ${ngAppName} --no-interactive --e2eTestRunner=none`
);
runCLI(
`generate @nrwl/react:app ${reactAppName} --no-interactive --e2eTestRunner=none`
);
runCLI(
`generate @nrwl/web:static-config --buildTarget=${ngAppName}:build --no-interactive`
);

View File

@ -474,6 +474,12 @@ Object {
"defaultConfiguration": "development",
"executor": "@angular-devkit/build-angular:dev-server",
},
"serve-static": Object {
"executor": "@nrwl/angular:file-server",
"options": Object {
"buildTarget": "my-dir-my-app:build",
},
},
"test": Object {
"configurations": Object {
"ci": Object {
@ -508,6 +514,9 @@ Object {
"targets": Object {
"e2e": Object {
"configurations": Object {
"ci": Object {
"devServerTarget": "my-dir-my-app:serve-static",
},
"production": Object {
"devServerTarget": "my-dir-my-app:serve:production",
},
@ -623,6 +632,12 @@ Object {
"defaultConfiguration": "development",
"executor": "@angular-devkit/build-angular:dev-server",
},
"serve-static": Object {
"executor": "@nrwl/angular:file-server",
"options": Object {
"buildTarget": "my-app:build",
},
},
"test": Object {
"configurations": Object {
"ci": Object {
@ -657,6 +672,9 @@ Object {
"targets": Object {
"e2e": Object {
"configurations": Object {
"ci": Object {
"devServerTarget": "my-app:serve-static",
},
"production": Object {
"devServerTarget": "my-app:serve:production",
},

View File

@ -1,12 +1,20 @@
import type { Tree } from '@nrwl/devkit';
import type { NormalizedSchema } from './normalized-schema';
import {
readProjectConfiguration,
updateProjectConfiguration,
} from '@nrwl/devkit';
import { cypressProjectGenerator } from '@nrwl/cypress';
import { removeScaffoldedE2e } from './remove-scaffolded-e2e';
export async function addE2e(tree: Tree, options: NormalizedSchema) {
removeScaffoldedE2e(tree, options, options.ngCliSchematicE2ERoot);
if (options.e2eTestRunner === 'cypress') {
// TODO: This can call `@nrwl/web:static-config` generator once we merge `@nrwl/angular:file-server` into `@nrwl/web:file-server`.
addFileServerTarget(tree, options, 'serve-static');
await cypressProjectGenerator(tree, {
name: options.e2eProjectName,
directory: options.directory,
@ -19,3 +27,19 @@ export async function addE2e(tree: Tree, options: NormalizedSchema) {
});
}
}
function addFileServerTarget(
tree: Tree,
options: NormalizedSchema,
targetName: string
) {
const projectConfig = readProjectConfiguration(tree, options.name);
projectConfig.targets[targetName] = {
executor: '@nrwl/angular:file-server',
options: {
buildTarget: `${options.name}:build`,
port: options.port,
},
};
updateProjectConfiguration(tree, options.name, projectConfig);
}

View File

@ -354,6 +354,48 @@ describe('Cypress Project', () => {
'apps/one/two/other-e2e/src/e2e/app.cy.ts',
].forEach((path) => expect(tree.exists(path)).toBeTruthy());
});
describe('serve-static', () => {
it('should configure Cypress with ci configuration if serve-static is found', async () => {
const appConfig = readProjectConfiguration(tree, 'my-app');
appConfig.targets['serve-static'] = {
executor: 'serve-static-executor',
options: {},
configurations: {
production: {},
},
};
updateProjectConfiguration(tree, 'my-app', appConfig);
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-app',
});
const e2eConfig = readProjectConfiguration(tree, 'my-app-e2e');
expect(e2eConfig.targets.e2e).toMatchObject({
options: {
devServerTarget: 'my-app:serve',
},
configurations: {
production: { devServerTarget: 'my-app:serve:production' },
ci: { devServerTarget: 'my-app:serve-static' },
},
});
});
it('should not configure Cypress with ci configuration if serve-static is not found', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-app',
});
const e2eConfig = readProjectConfiguration(tree, 'my-app-e2e');
expect(e2eConfig.targets.e2e.configurations.ci).toBeUndefined();
});
});
});
describe('v9 - v7', () => {

View File

@ -154,6 +154,11 @@ function addProject(tree: Tree, options: CypressProjectSchema) {
tags: [],
implicitDependencies: options.project ? [options.project] : undefined,
};
if (project.targets?.['serve-static']) {
e2eProjectConfig.targets.e2e.configurations.ci = {
devServerTarget: `${options.project}:serve-static`,
};
}
} else {
throw new Error(`Either project or baseUrl should be specified.`);
}

View File

@ -1,4 +1,4 @@
import { ensurePackage, Tree } from '@nrwl/devkit';
import { ensurePackage, joinPathFragments, Tree } from '@nrwl/devkit';
import { nxVersion } from '../../../utils/versions';
import { NormalizedSchema } from '../schema';
@ -7,6 +7,12 @@ export async function addCypress(host: Tree, options: NormalizedSchema) {
return () => {};
}
const { webStaticServeGenerator } = ensurePackage('@nrwl/web', nxVersion);
await webStaticServeGenerator(host, {
buildTarget: `${options.projectName}:build`,
targetName: 'serve-static',
});
const { cypressProjectGenerator } = ensurePackage('@nrwl/cypress', nxVersion);
return await cypressProjectGenerator(host, {

View File

@ -1,2 +1,3 @@
export { webInitGenerator } from './src/generators/init/init';
export { applicationGenerator } from './src/generators/application/application';
export { webStaticServeGenerator } from './src/generators/static-serve/static-serve-configuration';