nx/packages/cypress/src/generators/cypress-project/cypress-project.spec.ts
Leosvel Pérez Espinosa 678818a58b
feat(angular): upgrade Angular to v12.0.0-rc.3 (#5630)
* feat(angular): upgrade Angular to v12.0.0-rc.3

* feat(angular): target Nx v12.4.0-beta.0 for Angular v12.0.0-rc.0 upgrade

* fix(angular): use defaultConfiguration if no other configuration is passed

* cleanup(angular): sync migration folder name to target version

* fix(repo): creating custom schema flattener for docs

* chore(repo): amend yarn.lock

* feat(angular): update angular storybook to use webpack 5

* fix(angular): add legacy peer deps for angular+jest

* fix(angular): move migrations to 12.3.0-rc.0

Co-authored-by: Zack DeRose <zack.derose@gmail.com>
Co-authored-by: Jason Jean <jasonjean1993@gmail.com>
2021-05-12 12:20:12 -04:00

312 lines
10 KiB
TypeScript

import { readJson, readProjectConfiguration, Tree } from '@nrwl/devkit';
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
import { cypressProjectGenerator } from './cypress-project';
import { Schema } from './schema';
import { Linter } from '@nrwl/linter';
describe('schematic:cypress-project', () => {
let tree: Tree;
const defaultOptions: Omit<Schema, 'name' | 'project'> = {
linter: Linter.EsLint,
};
beforeEach(() => {
tree = createTreeWithEmptyWorkspace();
});
describe('Cypress Project', () => {
it('should generate files', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-app',
});
expect(tree.exists('apps/my-app-e2e/cypress.json')).toBeTruthy();
expect(tree.exists('apps/my-app-e2e/tsconfig.e2e.json')).toBeTruthy();
expect(
tree.exists('apps/my-app-e2e/src/fixtures/example.json')
).toBeTruthy();
expect(
tree.exists('apps/my-app-e2e/src/integration/app.spec.ts')
).toBeTruthy();
expect(tree.exists('apps/my-app-e2e/src/plugins/index.js')).toBeTruthy();
expect(tree.exists('apps/my-app-e2e/src/support/app.po.ts')).toBeTruthy();
expect(
tree.exists('apps/my-app-e2e/src/support/commands.ts')
).toBeTruthy();
expect(tree.exists('apps/my-app-e2e/src/support/index.ts')).toBeTruthy();
});
it('should add update `workspace.json` file', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-app',
linter: Linter.TsLint,
});
const workspaceJson = readJson(tree, 'workspace.json');
const project = workspaceJson.projects['my-app-e2e'];
expect(project.root).toEqual('apps/my-app-e2e');
expect(project.architect.lint).toEqual({
builder: '@angular-devkit/build-angular:tslint',
options: {
tsConfig: ['apps/my-app-e2e/tsconfig.e2e.json'],
exclude: ['**/node_modules/**', '!apps/my-app-e2e/**/*'],
},
});
expect(project.architect.e2e).toEqual({
builder: '@nrwl/cypress:cypress',
options: {
cypressConfig: 'apps/my-app-e2e/cypress.json',
devServerTarget: 'my-app:serve',
tsConfig: 'apps/my-app-e2e/tsconfig.e2e.json',
},
configurations: {
production: {
devServerTarget: 'my-app:serve:production',
},
},
});
});
it('should add update `workspace.json` file properly when eslint is passed', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-app',
linter: Linter.EsLint,
});
const workspaceJson = readJson(tree, 'workspace.json');
const project = workspaceJson.projects['my-app-e2e'];
expect(project.architect.lint).toEqual({
builder: '@nrwl/linter:eslint',
options: {
lintFilePatterns: ['apps/my-app-e2e/**/*.{js,ts}'],
},
});
});
it('should not add lint target when "none" is passed', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-app',
linter: Linter.None,
});
const workspaceJson = readJson(tree, 'workspace.json');
const project = workspaceJson.projects['my-app-e2e'];
expect(project.architect.lint).toBeUndefined();
});
it('should update nx.json', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-app',
linter: Linter.EsLint,
});
const project = readProjectConfiguration(tree, 'my-app-e2e');
expect(project.tags).toEqual([]);
expect(project.implicitDependencies).toEqual(['my-app']);
});
it('should set right path names in `cypress.json`', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-app',
});
const cypressJson = readJson(tree, 'apps/my-app-e2e/cypress.json');
expect(cypressJson).toEqual({
fileServerFolder: '.',
fixturesFolder: './src/fixtures',
integrationFolder: './src/integration',
modifyObstructiveCode: false,
pluginsFile: './src/plugins/index',
supportFile: './src/support/index.ts',
video: true,
videosFolder: '../../dist/cypress/apps/my-app-e2e/videos',
screenshotsFolder: '../../dist/cypress/apps/my-app-e2e/screenshots',
chromeWebSecurity: false,
});
});
it('should set right path names in `tsconfig.e2e.json`', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-app',
});
const tsconfigJson = readJson(tree, 'apps/my-app-e2e/tsconfig.e2e.json');
expect(tsconfigJson.extends).toEqual('./tsconfig.json');
expect(tsconfigJson.compilerOptions.outDir).toEqual('../../dist/out-tsc');
});
describe('nested', () => {
it('should update workspace.json', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-dir-my-app',
directory: 'my-dir',
linter: Linter.TsLint,
});
const projectConfig = readJson(tree, 'workspace.json').projects[
'my-dir-my-app-e2e'
];
expect(projectConfig).toBeDefined();
expect(projectConfig.architect.lint).toEqual({
builder: '@angular-devkit/build-angular:tslint',
options: {
tsConfig: ['apps/my-dir/my-app-e2e/tsconfig.e2e.json'],
exclude: ['**/node_modules/**', '!apps/my-dir/my-app-e2e/**/*'],
},
});
expect(projectConfig.architect.e2e).toEqual({
builder: '@nrwl/cypress:cypress',
options: {
cypressConfig: 'apps/my-dir/my-app-e2e/cypress.json',
devServerTarget: 'my-dir-my-app:serve',
tsConfig: 'apps/my-dir/my-app-e2e/tsconfig.e2e.json',
},
configurations: {
production: {
devServerTarget: 'my-dir-my-app:serve:production',
},
},
});
});
it('should set right path names in `cypress.json`', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-dir-my-app',
directory: 'my-dir',
});
const cypressJson = readJson(
tree,
'apps/my-dir/my-app-e2e/cypress.json'
);
expect(cypressJson).toEqual({
fileServerFolder: '.',
fixturesFolder: './src/fixtures',
integrationFolder: './src/integration',
modifyObstructiveCode: false,
pluginsFile: './src/plugins/index',
supportFile: './src/support/index.ts',
video: true,
videosFolder: '../../../dist/cypress/apps/my-dir/my-app-e2e/videos',
screenshotsFolder:
'../../../dist/cypress/apps/my-dir/my-app-e2e/screenshots',
chromeWebSecurity: false,
});
});
it('should set right path names in `tsconfig.e2e.json`', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
project: 'my-dir-my-app',
directory: 'my-dir',
});
const tsconfigJson = readJson(
tree,
'apps/my-dir/my-app-e2e/tsconfig.e2e.json'
);
expect(tsconfigJson.compilerOptions.outDir).toEqual(
'../../../dist/out-tsc'
);
});
});
describe('--project', () => {
describe('none', () => {
it('should not add any implicit dependencies', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'my-app-e2e',
});
const nxJson = readJson(tree, 'nx.json');
expect(nxJson.projects['my-app-e2e']).toEqual({ tags: [] });
});
});
});
describe('--linter', () => {
describe('eslint', () => {
it('should add eslint-plugin-cypress', async () => {
await cypressProjectGenerator(tree, {
name: 'my-app-e2e',
project: 'my-app',
linter: Linter.EsLint,
});
const packageJson = readJson(tree, 'package.json');
expect(
packageJson.devDependencies['eslint-plugin-cypress']
).toBeTruthy();
const eslintrcJson = readJson(tree, 'apps/my-app-e2e/.eslintrc.json');
expect(eslintrcJson).toMatchInlineSnapshot(`
Object {
"extends": Array [
"plugin:cypress/recommended",
"../../.eslintrc.json",
],
"ignorePatterns": Array [
"!**/*",
],
"overrides": Array [
Object {
"files": Array [
"*.ts",
"*.tsx",
"*.js",
"*.jsx",
],
"parserOptions": Object {
"project": "apps/my-app-e2e/tsconfig.*?.json",
},
"rules": Object {},
},
Object {
"files": Array [
"src/plugins/index.js",
],
"rules": Object {
"@typescript-eslint/no-var-requires": "off",
"no-undef": "off",
},
},
],
}
`);
});
});
});
it('should generate in the correct folder', async () => {
await cypressProjectGenerator(tree, {
...defaultOptions,
name: 'other-e2e',
project: 'my-app',
directory: 'one/two',
});
const workspace = readJson(tree, 'workspace.json');
expect(workspace.projects['one-two-other-e2e']).toBeDefined();
[
'apps/one/two/other-e2e/cypress.json',
'apps/one/two/other-e2e/src/integration/app.spec.ts',
].forEach((path) => expect(tree.exists(path)).toBeTruthy());
});
});
});