# Cypress Angular Schematic

> 🔖  **Official Angular Schematic and Builder for the Angular CLI.** <br/>
> This project is maintained by the Cypress Team.

<p align="center">
  <a href="https://cypress.io">
    <img width="140" alt="Cypress Logo" src="https://raw.githubusercontent.com/cypress-io/cypress/develop/npm/cypress-schematic/src/svgs/built-by-cypress.svg" />
    </a>
</p>

 Add this schematic to quickly get up and running with [Cypress](https://cypress.io) in your Angular project. 

 ___

 ## What does this schematic do?

**Once added to your project, it will:**

✅  Install Cypress

✅  Add npm scripts for running Cypress e2e tests in `run` mode and `open` mode

✅  Scaffold base Cypress files and directories

✅  Provide the ability to add new e2e and component specs easily using `ng-generate`

✅  Optional: prompt you to add or update the default `ng e2e` command to use Cypress for e2e tests.

✅  Optional: prompt you to add a `ng ct` command to use Cypress component testing.

## Requirements

- Angular 18.0.0+ (`@cypress/schematic@2` supports Angular 13 - 16 and `@cypress/schematic@3` supports Angular 17)
## Usage ⏯

### Adding E2E and Component Testing

To install the schematic via prompts:

```shell
ng add @cypress/schematic
```

To install the schematic via cli arguments (installs both e2e and component testing):

```shell
ng add @cypress/schematic --e2e --component
```

The installation will add this schematic to the [default schematic collections](https://angular.io/guide/workspace-config#angular-cli-configuration-options). This allows you to execute the CLI commands without prefixing them with the package name.

To run Cypress in `open` mode within your project: 

```shell script
ng run {project-name}:cypress-open
```

To run Cypress headlessly via `run` mode within your project:

```shell script
ng run {project-name}:cypress-run
```

If you have chosen to add or update the `ng e2e` command, you can also run Cypress in `open` mode using this:

```shell script
ng e2e
```

If you have chosen to add Cypress component testing, you can run component tests in `open` mode using this:

```shell script
ng run {project-name}:ct
```

### Generating New Cypress Spec Files

To generate a new e2e spec file:

```shell script
ng generate spec 
```

or (without cli prompt)

```shell script
ng generate spec {name}
```

To generate a new component spec file:

```shell script
ng generate spec --component
```

or (without cli prompt)

```shell script
ng generate spec {component name} --component
```

To generate a new component spec file in a specific folder:

```shell script
ng generate spec {component name} --component --path {path relative to project root}
```

To generate new component spec files alongside all component files in a project:

```shell script
ng generate specs-ct
```

To generate a new, generic component definition with a component spec file in the given or default project. This wraps the [Angular CLI Component Generator](https://angular.io/cli/generate#component) and supports the same arguments.

```shell script
ng generate component {component name}
```

## Builder Options 🛠

### Running the builder with a specific browser

Before running Cypress in `open` mode, ensure that you have started your application server using `ng serve`.

```json
"cypress-open": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "watch": true,
    "headless": false,
    "browser": "chrome"
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:serve:production"
    }
  }
}
```

Read our docs to learn more about [launching browsers](https://on.cypress.io/launching-browsers) with Cypress.

### Recording test results to Cypress Cloud

We recommend setting your [Cypress Cloud](https://on.cypress.io/features-dashboard) recording key as an environment variable and NOT as a builder option when running it in CI.

```json
"cypress-run": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "devServerTarget": "{project-name}:serve",
    "record": true,
    "key": "your-cypress-cloud-recording-key"
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:production"
    }
  }
}
```

Read our docs to learn more about [recording test results](https://on.cypress.io/recording-project-runs) to [Cypress Cloud](https://on.cypress.io/features-dashboard).

### Specifying a custom config file

It may be useful to have different Cypress configuration files per environment (ie. development, staging, production).

```json
"cypress-run": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "devServerTarget": "{project-name}:serve",
    "configFile": "cypress.production.js"
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:production"
    }
  }
}
```

Read our docs to learn more about all the [configuration options](https://on.cypress.io/configuration) Cypress offers.

### Running Cypress in parallel mode within CI

```json
"cypress-run": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "devServerTarget": "{project-name}:serve",
    "parallel": true,
    "record": true,
    "key": "your-cypress-cloud-recording-key"
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:production"
    }
  }
}
```

Read our docs to learn more about speeding up test execution in CI via [Cypress parallelization](https://on.cypress.io/parallelization)

### Specifying a custom reporter and options

You may want to specify a custom reporter. Cypress works with any reporters built for Mocha: built-in, third-party, or custom. In addition to specifying reporters, you can specify reporter options. These differ based on the reporter, and you should refer to its documentation for supported options.

```json
"cypress-run": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "devServerTarget": "{project-name}:serve",
    "reporter": "junit",
    "reporterOptions": {
      "mochaFile": "results/my-test-output.xml",
      "toConsole": true
    }
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:production"
    }
  }
}
```

Read our docs to learn more about working with [reporters](https://on.cypress.io/reporters).

### Running the builder with a different baseUrl

You can specify a `baseUrl` that is different than the one in `cypress.config.js`. There are two ways to do this.

1. Add `baseUrl` to `configurations` like the following: 

```json
"cypress-open": {
  "builder": "@cypress/schematic:cypress",
  "options": {
    "devServerTarget": "{project-name}:serve",
    "watch": true,
    "headless": false
  },
  "configurations": {
    "production": {
      "devServerTarget": "{project-name}:serve:production"
    },
    "local-dev": {
      "devServerTarget": "{project-name}:serve:development",
      "baseUrl": "http://localhost:4002"
    },
    "another-env": {
      "devServerTarget": "{project-name}:serve:development",
      "baseUrl": "http://localhost:4004"
    }
  }
}
```

2. Add custom options to `devServerTarget` in `angular.json`:

```json
"options": {
  "host": "localhost",
  "port": 4200
},
```

In order to prevent the application from building, add the following to the end of your command:

```shell
--dev-server-target=''
```

## Generator Options

### Specify Testing Type 

The default generated spec is E2E.  In order to generate a component test you can run:

```shell script
ng generate @cypress/schematic:spec --name=button -t component
```

`-t` is an alias for `testing-type`. It accepts `e2e` or `component` as arguments. If you are using the CLI tool, a prompt will appear asking which spec type you want to generate.

### Specify Filename (bypassing CLI prompt)

In order to bypass the prompt asking for your spec name add a `--name=` flag like this:

```shell script
ng generate @cypress/schematic:spec --name=login
```

This will create a new spec file named `login.cy.ts` in the default Cypress folder location.

### Specify Project

Add a `--project=` flag to specify the project:

```shell script
ng generate @cypress/schematic:spec --name=login --project=sandbox
```
### Specify Path

Add a `--path=` flag to specify the project:

```shell script
ng generate @cypress/schematic:spec --name=login --path=src/app/tests
```

This will create a spec file in your specific location, creating folders as needed. By default, new specs are created in either `cypress/e2e` for E2E specs or `cypress/ct` for component specs.

### Generate Tests for All Components

You can scaffold component test specs alongside all your components in the default project by using:

```shell script
ng generate @cypress/schematic:specs-ct -g
```

This will identify files ending in `component.ts`. It will then create spec files alongside them - if they don't exist.

If you would like to specify a project, you can use the command:

```shell script
ng generate @cypress/schematic:specs-ct -g -p {project-name}
```

## Migrating from Protractor to Cypress?

Read our [migration guide](https://on.cypress.io/protractor-to-cypress) to help you make the transition from Protractor to Cypress.

## Questions or Issues?

Visit our [plugins discussion](https://github.com/cypress-io/cypress/discussions/categories/plugins) to ask questions or report issues related to this package.

## License

This project is licensed under an MIT license. 

## Community Recognition

The [Cypress Angular Schematic](https://www.npmjs.com/package/@cypress/schematic) package was made possible by the original work of the [Briebug](https://briebug.com/) team and the contributors of [@briebug/cypress-schematic](https://www.npmjs.com/package/@briebug/cypress-schematic).

@briebug/cypress-schematic served as the starting point for improvements and new functionality the Cypress team will continue to develop along with the community.
