import { readJson, Tree } from '@nrwl/devkit'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; import { Linter } from '@nrwl/linter'; import init from './init'; import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners'; import { Styles } from '../utils/types'; describe('init', () => { let host: Tree; beforeEach(() => { host = createTreeWithEmptyWorkspace(); }); it('should add angular dependencies', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, linter: Linter.EsLint, skipFormat: false, }); // ASSERT const { dependencies, devDependencies } = readJson(host, 'package.json'); expect(dependencies['@angular/animations']).toBeDefined(); expect(dependencies['@angular/common']).toBeDefined(); expect(dependencies['@angular/compiler']).toBeDefined(); expect(dependencies['@angular/core']).toBeDefined(); expect(dependencies['@angular/platform-browser']).toBeDefined(); expect(dependencies['@angular/platform-browser-dynamic']).toBeDefined(); expect(dependencies['@angular/router']).toBeDefined(); expect(dependencies['rxjs']).toBeDefined(); expect(dependencies['zone.js']).toBeDefined(); expect(devDependencies['@angular/compiler-cli']).toBeDefined(); expect(devDependencies['@angular/language-service']).toBeDefined(); expect(devDependencies['@angular-devkit/build-angular']).toBeDefined(); // codelyzer should no longer be there by default expect(devDependencies['codelyzer']).toBeUndefined(); }); it('should add a postinstall script for ngcc', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Karma, linter: Linter.EsLint, skipFormat: false, }); const packageJson = readJson(host, 'package.json'); // ASSERT expect(packageJson.scripts.postinstall).toEqual( 'ngcc --properties es2015 browser module main' ); }); describe('--unit-test-runner', () => { describe('karma', () => { it('should add karma dependencies', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Karma, linter: Linter.EsLint, skipFormat: false, }); const { devDependencies } = readJson(host, 'package.json'); // ASSERT expect(devDependencies['karma']).toBeDefined(); expect(devDependencies['karma-chrome-launcher']).toBeDefined(); expect( devDependencies['karma-coverage-istanbul-reporter'] ).toBeDefined(); expect(devDependencies['karma-jasmine']).toBeDefined(); expect(devDependencies['karma-jasmine-html-reporter']).toBeDefined(); expect(devDependencies['jasmine-core']).toBeDefined(); expect(devDependencies['jasmine-spec-reporter']).toBeDefined(); expect(devDependencies['@types/jasmine']).toBeDefined(); }); it('should add karma configuration', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Karma, linter: Linter.EsLint, skipFormat: false, }); const hasKarmaConfigFile = host.exists('karma.conf.js'); // ASSERT expect(hasKarmaConfigFile).toBeTruthy(); }); it('should set defaults', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Karma, linter: Linter.EsLint, skipFormat: false, }); const { schematics } = readJson(host, 'workspace.json'); // ASSERT expect(schematics['@nrwl/angular:application'].unitTestRunner).toEqual( 'karma' ); expect(schematics['@nrwl/angular:library'].unitTestRunner).toEqual( 'karma' ); }); }); describe('jest', () => { it('should add jest dependencies', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, linter: Linter.EsLint, skipFormat: false, }); const { devDependencies } = readJson(host, 'package.json'); // ASSERT expect(devDependencies['@nrwl/jest']).toBeDefined(); expect(devDependencies['jest']).toBeDefined(); expect(devDependencies['jest-preset-angular']).toBeDefined(); }); it('should add jest configuration', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, linter: Linter.EsLint, skipFormat: false, }); const hasJestConfigFile = host.exists('jest.config.js'); // ASSERT expect(hasJestConfigFile).toBeTruthy(); }); it('should set defaults', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, linter: Linter.EsLint, skipFormat: false, }); const { schematics } = readJson(host, 'workspace.json'); // ASSERT expect(schematics['@nrwl/angular:application'].unitTestRunner).toEqual( 'jest' ); expect(schematics['@nrwl/angular:library'].unitTestRunner).toEqual( 'jest' ); }); }); }); describe('--e2e-test-runner', () => { describe('cypress', () => { it('should add cypress dependencies', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, e2eTestRunner: E2eTestRunner.Cypress, linter: Linter.EsLint, skipFormat: false, }); const { devDependencies } = readJson(host, 'package.json'); // ASSERT expect(devDependencies['@nrwl/cypress']).toBeDefined(); expect(devDependencies['cypress']).toBeDefined(); }); it('should set defaults', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, e2eTestRunner: E2eTestRunner.Cypress, linter: Linter.EsLint, skipFormat: false, }); const { schematics } = readJson(host, 'workspace.json'); // ASSERT expect(schematics['@nrwl/angular:application'].e2eTestRunner).toEqual( 'cypress' ); }); }); describe('protractor', () => { it('should add protractor dependencies', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, e2eTestRunner: E2eTestRunner.Protractor, linter: Linter.EsLint, skipFormat: false, }); const { devDependencies } = readJson(host, 'package.json'); // ASSERT expect(devDependencies['protractor']).toBeDefined(); expect(devDependencies['jasmine-core']).toBeDefined(); expect(devDependencies['jasmine-spec-reporter']).toBeDefined(); expect(devDependencies['@types/jasmine']).toBeDefined(); expect(devDependencies['@types/jasminewd2']).toBeDefined(); }); it('should set defaults', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, e2eTestRunner: E2eTestRunner.Protractor, linter: Linter.EsLint, skipFormat: false, }); const { schematics } = readJson(host, 'workspace.json'); // ASSERT expect(schematics['@nrwl/angular:application'].e2eTestRunner).toEqual( 'protractor' ); }); }); }); describe('--linter', () => { describe('eslint', () => { it('should set the default to eslint', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, linter: Linter.EsLint, skipFormat: false, }); const workspaceJson = readJson(host, 'workspace.json'); // ASSERT expect( workspaceJson.schematics['@nrwl/angular:application'].linter ).toEqual('eslint'); expect( workspaceJson.schematics['@nrwl/angular:library'].linter ).toEqual('eslint'); }); }); describe('none', () => { it('should set the default to none', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.None, linter: Linter.None, skipFormat: false, }); const workspaceJson = readJson(host, 'workspace.json'); // ASSERT expect( workspaceJson.schematics['@nrwl/angular:application'].linter ).toEqual('none'); expect( workspaceJson.schematics['@nrwl/angular:library'].linter ).toEqual('none'); }); }); }); describe('defaultCollection', () => { it('should be set if none was set before', async () => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, e2eTestRunner: E2eTestRunner.Cypress, linter: Linter.EsLint, skipFormat: false, }); const workspaceJson = readJson(host, 'workspace.json'); // ASSERT expect(workspaceJson.cli.defaultCollection).toEqual('@nrwl/angular'); }); it.each(['css', 'scss', 'less'])( 'should set "%s" as default style extension for components', async (style: Styles) => { // ACT await init(host, { unitTestRunner: UnitTestRunner.Jest, e2eTestRunner: E2eTestRunner.Cypress, linter: Linter.EsLint, skipFormat: false, style, }); const workspaceJson = readJson(host, 'workspace.json'); // ASSERT expect( workspaceJson.schematics['@nrwl/angular:component']['style'] ).toBe(style); } ); }); });