Skip to content

Commit

Permalink
fix(@angular/cli): fix error handling on test
Browse files Browse the repository at this point in the history
Fix #2778
Fix #3424
  • Loading branch information
filipesilva authored and hansl committed Mar 20, 2017
1 parent 303b2c0 commit 9cda847
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 1 deletion.
4 changes: 3 additions & 1 deletion packages/@angular/cli/models/webpack-configs/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as webpack from 'webpack';

import { CliConfig } from '../config';
import { WebpackTestOptions } from '../webpack-test-config';
import { KarmaWebpackEmitlessError } from '../../plugins/karma-webpack-emitless-error';

/**
* Enumerate loaders and their dependencies from this file to let the dependency validator
Expand Down Expand Up @@ -57,7 +58,8 @@ export function getTestConfig(testConfig: WebpackTestOptions) {
new webpack.SourceMapDevToolPlugin({
filename: null, // if no value is provided the sourcemap is inlined
test: /\.(ts|js)($|\?)/i // process .js and .ts files only
})
}),
new KarmaWebpackEmitlessError()
]
};
}
20 changes: 20 additions & 0 deletions packages/@angular/cli/plugins/karma-webpack-emitless-error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Don't emit anything when there are compilation errors. This is useful for preventing Karma
// from re-running tests when there is a compilation error.
// Workaround for https://github.com/webpack-contrib/karma-webpack/issues/49

export class KarmaWebpackEmitlessError {
constructor() { }

apply(compiler: any): void {
compiler.plugin('done', (stats: any) => {
if (stats.compilation.errors.length > 0) {
stats.stats = [{
toJson: function () {
return this;
},
assets: []
}];
}
});
}
}
14 changes: 14 additions & 0 deletions packages/@angular/cli/plugins/karma-webpack-throw-error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Force Webpack to throw compilation errors. Useful with karma-webpack when in single-run mode.
// Workaround for https://github.com/webpack-contrib/karma-webpack/issues/66

export class KarmaWebpackThrowError {
constructor() { }

apply(compiler: any): void {
compiler.plugin('done', (stats: any) => {
if (stats.compilation.errors.length > 0) {
throw new Error(stats.compilation.errors.map((err: any) => err.message || err));
}
});
}
}
6 changes: 6 additions & 0 deletions packages/@angular/cli/plugins/karma.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as glob from 'glob';
import { Pattern } from './glob-copy-webpack-plugin';
import { extraEntryParser } from '../models/webpack-configs/utils';
import { WebpackTestConfig, WebpackTestOptions } from '../models/webpack-test-config';
import { KarmaWebpackThrowError } from './karma-webpack-throw-error';

const getAppFromConfig = require('../utilities/app-utils').getAppFromConfig;

Expand Down Expand Up @@ -102,6 +103,11 @@ const init: any = (config: any) => {
}
};

// If Karma is being ran in single run mode, throw errors.
if (config.singleRun) {
webpackConfig.plugins.push(new KarmaWebpackThrowError());
}

config.webpack = Object.assign(webpackConfig, config.webpack);
config.webpackMiddleware = Object.assign(webpackMiddlewareConfig, config.webpackMiddleware);

Expand Down
10 changes: 10 additions & 0 deletions tests/e2e/tests/test/test-fail-single-run.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { ng } from '../../utils/process';
import { writeFile } from '../../utils/fs';
import { expectToFail } from '../../utils/utils';


export default function () {
// Fails on single run with broken compilation.
return writeFile('src/app.component.spec.ts', '<p> definitely not typescript </p>')
.then(() => expectToFail(() => ng('test', '--single-run')));
}
28 changes: 28 additions & 0 deletions tests/e2e/tests/test/test-fail-watch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {
killAllProcesses,
waitForAnyProcessOutputToMatch,
silentExecAndWaitForOutputToMatch
} from '../../utils/process';
import { expectToFail } from '../../utils/utils';
import { readFile, writeFile } from '../../utils/fs';


// Karma is only really finished with a run when it shows a non-zero total time in the first slot.
const karmaGoodRegEx = /Executed 3 of 3 SUCCESS \(\d+\.\d+ secs/;

export default function () {
let originalSpec: string;
return silentExecAndWaitForOutputToMatch('ng', ['test', '--no-progress'], karmaGoodRegEx)
.then(() => readFile('src/app/app.component.spec.ts'))
.then((data) => originalSpec = data)
// Trigger a failed rebuild, which shouldn't run tests again.
.then(() => writeFile('src/app/app.component.spec.ts', '<p> definitely not typescript </p>'))
.then(() => expectToFail(() => waitForAnyProcessOutputToMatch(karmaGoodRegEx, 10000)))
// Restore working spec.
.then(() => writeFile('src/app/app.component.spec.ts', originalSpec))
.then(() => waitForAnyProcessOutputToMatch(karmaGoodRegEx, 10000))
.then(() => killAllProcesses(), (err: any) => {
killAllProcesses();
throw err;
});
}

0 comments on commit 9cda847

Please sign in to comment.