Skip to content

Commit

Permalink
fix: add reaction on viewMode at grouping of error
Browse files Browse the repository at this point in the history
  • Loading branch information
CatWithApple committed Apr 4, 2019
1 parent ecb9dc5 commit 916c43f
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 40 deletions.
21 changes: 14 additions & 7 deletions lib/static/modules/group-errors.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
'use strict';

const {get} = require('lodash');
const {isSuccessStatus} = require('../../common-utils');
import {get, filter} from 'lodash';
import {isSuiteFailed} from './utils';
import {isFailStatus, isErroredStatus} from '../../common-utils';

const imageComparisonErrorMessage = 'image comparison failed';

/**
* @param {object} suites
* @param {string} viewMode
* @param {array} errorPatterns
* @param {array} filteredBrowsers
* @param {string} [testNameFilter]
* @return {array}
*/
function groupErrors({suites, errorPatterns = [], filteredBrowsers = [], testNameFilter = ''}) {
const testWithErrors = extractErrors(suites);
function groupErrors({suites, viewMode = 'all', errorPatterns = [], filteredBrowsers = [], testNameFilter = ''}) {
const showOnlyFailed = viewMode !== 'all';
const filteredSuites = showOnlyFailed ? filter(suites, isSuiteFailed) : suites;
const testWithErrors = extractErrors(filteredSuites, showOnlyFailed);

const errorGroupsList = getErrorGroupList(testWithErrors, errorPatterns, filteredBrowsers, testNameFilter);

Expand All @@ -26,7 +32,7 @@ function groupErrors({suites, errorPatterns = [], filteredBrowsers = [], testNam
return errorGroupsList;
}

function extractErrors(rootSuites) {
function extractErrors(rootSuites, showOnlyFailed) {
const testWithErrors = {};

const extract = (suites) => {
Expand All @@ -36,7 +42,8 @@ function extractErrors(rootSuites) {

if (suite.browsers) {
for (const browser of suite.browsers) {
if (isSuccessStatus(browser.result.status)) {
const {status} = browser.result;
if (showOnlyFailed && !isFailStatus(status) && !isErroredStatus(status)) {
continue;
}
const retries = [...browser.retries, browser.result];
Expand Down Expand Up @@ -69,7 +76,7 @@ function extractErrorsFromRetries(retries) {
errorsInRetry.add(error.message);
}
if (diffImg) {
errorsInRetry.add('image comparison failed');
errorsInRetry.add(imageComparisonErrorMessage);
}
}
}
Expand Down
42 changes: 31 additions & 11 deletions lib/static/modules/reducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ const localStorage = window.localStorage;
function getInitialState(data) {
const {skips, suites, config, total, updated, passed,
failed, skipped, warned, retries, perBrowser, apiValues, gui = false, date} = data;
const {errorPatterns, scaleImages, lazyLoadOffset, defaultView} = config;
const {errorPatterns, scaleImages, lazyLoadOffset, defaultView: viewMode} = config;
const parsedURL = new URL(window.location.href);
const filteredBrowsers = parsedURL.searchParams.getAll('browser');

const formattedSuites = formatSuitesData(suites);
const groupedErrors = groupErrors({suites: formattedSuites.suites, errorPatterns, filteredBrowsers});
const groupedErrors = groupErrors({suites: formattedSuites.suites, viewMode, errorPatterns, filteredBrowsers});

return merge(defaultState, {
gui,
Expand All @@ -32,7 +32,7 @@ function getInitialState(data) {
perBrowser
},
view: {
viewMode: defaultView,
viewMode,
scaleImages,
lazyLoadOffset,
..._loadBaseHost(config.baseHost, localStorage),
Expand All @@ -53,11 +53,12 @@ export default function reducer(state = getInitialState(compiledData), action) {
config: {scaleImages, lazyLoadOffset}
} = action.payload;
const {errorPatterns} = state.config;
const {filteredBrowsers, testNameFilter} = state.view;
const {filteredBrowsers, testNameFilter, viewMode} = state.view;

const formattedSuites = formatSuitesData(suites);
const groupedErrors = groupErrors({
suites: formattedSuites.suites,
viewMode,
errorPatterns,
filteredBrowsers,
testNameFilter
Expand All @@ -79,7 +80,7 @@ export default function reducer(state = getInitialState(compiledData), action) {
}
case actionNames.RUN_ALL_TESTS: {
const suites = clone(state.suites);
Object.values(suites).map(suite => setStatusToAll(suite, action.payload.status));
Object.values(suites).forEach(suite => setStatusToAll(suite, action.payload.status));

// TODO: rewrite store on run all tests
return merge({}, state, {running: true, suites, view: {groupByError: false}});
Expand Down Expand Up @@ -145,10 +146,10 @@ export default function reducer(state = getInitialState(compiledData), action) {
return _mutateStateView(state, {expand: 'none'});
}
case actionNames.VIEW_SHOW_ALL: {
return _mutateStateView(state, {viewMode: 'all', expand: 'errors'});
return _mutateViewMode(state, 'all');
}
case actionNames.VIEW_SHOW_FAILED: {
return _mutateStateView(state, {viewMode: 'failed', expand: 'errors'});
return _mutateViewMode(state, 'failed');
}
case actionNames.VIEW_TOGGLE_SKIPPED: {
return _mutateStateView(state, {showSkipped: !state.view.showSkipped});
Expand All @@ -173,10 +174,10 @@ export default function reducer(state = getInitialState(compiledData), action) {
const {
suites,
config: {errorPatterns},
view: {filteredBrowsers}
view: {viewMode, filteredBrowsers}
} = state;

const groupedErrors = groupErrors({suites, errorPatterns, filteredBrowsers, testNameFilter});
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});

return {
...state,
Expand Down Expand Up @@ -224,7 +225,7 @@ export default function reducer(state = getInitialState(compiledData), action) {
function addTestResult(state, action) {
const {
config: {errorPatterns},
view: {filteredBrowsers, testNameFilter}
view: {viewMode, filteredBrowsers, testNameFilter}
} = state;
const suites = clone(state.suites);

Expand All @@ -248,7 +249,7 @@ function addTestResult(state, action) {
const suiteIds = clone(state.suiteIds);
assign(suiteIds, {failed: getFailedSuiteIds(suites)});

const groupedErrors = groupErrors({suites, errorPatterns, filteredBrowsers, testNameFilter});
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});

return assign({}, state, {suiteIds, suites, groupedErrors});
}
Expand Down Expand Up @@ -301,6 +302,25 @@ function _mutateStateView(state, mutation) {
return assign(clone(state), {view: newView});
}

function _mutateViewMode(state, viewMode) {
const {
suites,
config: {errorPatterns},
view: {filteredBrowsers, testNameFilter}
} = state;
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});

return {
...state,
groupedErrors,
view: {
...state.view,
viewMode,
expand: 'errors'
}
};
}

function _loadBaseHost(configuredHost, storage) {
if (!storage) {
return configuredHost;
Expand Down
94 changes: 72 additions & 22 deletions test/lib/static/modules/group-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,80 @@ const {
} = require('../../../utils');
const {mkImg_} = require('../components/utils');

function mkBrowserResultWithStatus(status) {
return mkBrowserResult({
name: `${status} test`,
result: mkTestResult({
status: status
}),
retries: [
mkTestResult({
error: {
message: `message stub ${status}`
}
})
]
});
}

describe('static/modules/group-errors', () => {
it('should not collect errors from success test', () => {
it('should collect errors from all tests if viewMode is "all"', () => {
const suites = [
mkSuiteTree({
browsers: [
mkBrowserResult({
result: mkTestResult({
status: 'success'
}),
retries: [
mkTestResult({
error: {
message: 'message stub'
}
})
]
})
mkBrowserResultWithStatus('skipped'),
mkBrowserResultWithStatus('success'),
mkBrowserResultWithStatus('fail'),
mkBrowserResultWithStatus('error')
]
})
];

const result = groupErrors({suites});
const result = groupErrors({suites, viewMode: 'all'});

assert.lengthOf(result, 4);
assert.include(result[0], {
count: 1,
name: 'message stub error'
});
assert.include(result[1], {
count: 1,
name: 'message stub fail'
});
assert.include(result[2], {
count: 1,
name: 'message stub skipped'
});
assert.include(result[3], {
count: 1,
name: 'message stub success'
});
});

assert.deepEqual(result, []);
it('should collect errors only from failed tests if viewMode is "failed"', () => {
const suites = [
mkSuiteTree({
suite: mkSuite({status: 'error'}),
browsers: [
mkBrowserResultWithStatus('skipped'),
mkBrowserResultWithStatus('success'),
mkBrowserResultWithStatus('fail'),
mkBrowserResultWithStatus('error')
]
})
];

const result = groupErrors({suites, viewMode: 'failed'});

assert.lengthOf(result, 2);
assert.include(result[0], {
count: 1,
name: 'message stub error'
});
assert.include(result[1], {
count: 1,
name: 'message stub fail'
});
});

it('should collect errors from error and imagesInfo[].error', () => {
Expand Down Expand Up @@ -82,9 +132,7 @@ describe('static/modules/group-errors', () => {
browsers: [
mkBrowserResult({
result: mkTestResult({
imagesInfo: [
{diffImg: mkImg_()}
]
imagesInfo: [{diffImg: mkImg_()}]
})
})
]
Expand All @@ -93,10 +141,12 @@ describe('static/modules/group-errors', () => {

const result = groupErrors({suites});

assert.strictEqual(result.length, 1);
assert.strictEqual(result[0].count, 1);
assert.strictEqual(result[0].name, 'image comparison failed');
assert.strictEqual(result[0].pattern, 'image comparison failed');
assert.lengthOf(result, 1);
assert.include(result[0], {
count: 1,
name: 'image comparison failed',
pattern: 'image comparison failed'
});
});

it('should collect errors from result and retries', () => {
Expand Down

0 comments on commit 916c43f

Please sign in to comment.