UNPKG

@stryker-mutator/core

Version:

The extendable JavaScript mutation testing framework

154 lines 7.15 kB
import fs from 'fs/promises'; import os from 'os'; import sinon from 'sinon'; import { expect } from 'chai'; import inquirer from 'inquirer'; import { testInjector } from '@stryker-mutator/test-helpers'; import { coreTokens } from '../../../src/di/index.js'; import { AngularInitializer } from '../../../src/initializer/custom-initializers/angular-initializer.js'; import { ReactInitializer } from '../../../src/initializer/custom-initializers/react-initializer.js'; import { VueJsInitializer } from '../../../src/initializer/custom-initializers/vue-js-initializer.js'; import { fileUtils } from '../../../src/utils/file-utils.js'; describe('CustomInitializers', () => { let inquirerPrompt; beforeEach(() => { inquirerPrompt = sinon.stub(inquirer, 'prompt'); }); describe(AngularInitializer.name, () => { let sut; let execaStub; let resolveStub; let existsStub; let readFileStub; let cpusStub; beforeEach(() => { existsStub = sinon.stub(fileUtils, 'exists'); readFileStub = sinon.stub(fs, 'readFile'); execaStub = sinon.stub(); resolveStub = sinon.stub(); cpusStub = sinon.stub(os, 'cpus'); const sevenCores = [ { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, { model: 'Intel(R) Core(TM) i7' }, ]; cpusStub.returns(sevenCores); sut = testInjector.injector .provideValue(coreTokens.execa, execaStub) .provideValue(coreTokens.resolveFromCwd, resolveStub) .injectClass(AngularInitializer); }); it('should have the name "angular-cli"', () => { expect(sut.name).to.eq('angular-cli'); }); it('should provide expected config', async () => { const { config } = await sut.createConfig(); const expectedConfig = { mutate: ['src/**/*.ts', '!src/**/*.spec.ts', '!src/test.ts', '!src/environments/*.ts'], testRunner: 'karma', karma: { configFile: 'karma.conf.js', projectType: 'angular-cli', config: { browsers: ['ChromeHeadless'], }, }, reporters: ['progress', 'clear-text', 'html'], concurrency: 3, concurrency_comment: 'Recommended to use about half of your available cores when running stryker with angular', coverageAnalysis: 'perTest', }; expect(config).deep.eq(expectedConfig); }); it('should create a karma config when none is found and `@angular/cli` version supports it', async () => { // Arrange resolveStub.returns('./node_modules/@angular/cli/package.json'); existsStub.resolves(false); readFileStub.resolves('{"version": "15.1.0"}'); execaStub.resolves({ stdout: Buffer.from('') }); // Act await sut.createConfig(); // Assert sinon.assert.calledOnceWithExactly(resolveStub, '@angular/cli/package.json'); sinon.assert.calledOnceWithExactly(existsStub, 'karma.conf.js'); sinon.assert.calledOnceWithExactly(execaStub, 'npx ng generate config karma'); sinon.assert.calledOnceWithExactly(readFileStub, './node_modules/@angular/cli/package.json', 'utf8'); }); it('should not create a karma config when the `@angular/cli` version does not support it', async () => { // Arrange resolveStub.returns('./node_modules/@angular/cli/package.json'); existsStub.resolves(false); readFileStub.resolves('{"version": "15.0.9"}'); // version 15.1 added the support execaStub.resolves({ stdout: Buffer.from('') }); // Act await sut.createConfig(); // Assert sinon.assert.notCalled(execaStub); }); it('should not create a karma config when it already exists', async () => { // Arrange resolveStub.returns('./node_modules/@angular/cli/package.json'); existsStub.resolves(true); readFileStub.resolves('{"version": "16.0.0"}'); execaStub.resolves({ stdout: Buffer.from('') }); // Act await sut.createConfig(); // Assert sinon.assert.notCalled(execaStub); }); it('should log details when creating a karma config', async () => { // Arrange resolveStub.returns('./node_modules/@angular/cli/package.json'); existsStub.resolves(false); readFileStub.resolves('{"version": "15.1.0"}'); execaStub.resolves({ stdout: 'Some detailed output' }); // Act await sut.createConfig(); // Assert sinon.assert.calledWithExactly(testInjector.logger.info, 'No "karma.conf.js" file found, running command: "npx ng generate config karma"'); sinon.assert.calledWithExactly(testInjector.logger.info, '\nSome detailed output'); }); it('should log a warning, but not crash when discovering angular-cli version fails', async () => { // Arrange const expectedError = new Error('Expected error'); resolveStub.returns('./node_modules/@angular/cli/package.json'); existsStub.resolves(false); readFileStub.rejects(expectedError); // Act await sut.createConfig(); // Assert sinon.assert.calledWithExactly(testInjector.logger.warn, `Could not discover your local angular-cli version. Continuing without generating karma configuration. ${expectedError.stack}`); }); }); describe(ReactInitializer.name, () => { let sut; beforeEach(() => { sut = testInjector.injector.injectClass(ReactInitializer); }); it('should have the name "create-react-app"', () => { expect(sut.name).to.eq('create-react-app'); }); }); describe(VueJsInitializer.name, () => { let sut; beforeEach(() => { sut = testInjector.injector.injectClass(VueJsInitializer); inquirerPrompt.resolves({ script: 'typescript', testRunner: 'vitest', }); }); it('should have the name "vue"', () => { expect(sut.name).to.eq('vue'); }); it('should install @stryker-mutator/vitest-runner when jest is chosen', async () => { const config = await sut.createConfig(); expect(config.dependencies).to.include('@stryker-mutator/vitest-runner'); }); }); }); //# sourceMappingURL=custom-initializers.spec.js.map