Skip to content

Commit 916c43f

Browse files
committed
fix: add reaction on viewMode at grouping of error
1 parent ecb9dc5 commit 916c43f

File tree

3 files changed

+117
-40
lines changed

3 files changed

+117
-40
lines changed

lib/static/modules/group-errors.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
'use strict';
22

3-
const {get} = require('lodash');
4-
const {isSuccessStatus} = require('../../common-utils');
3+
import {get, filter} from 'lodash';
4+
import {isSuiteFailed} from './utils';
5+
import {isFailStatus, isErroredStatus} from '../../common-utils';
6+
7+
const imageComparisonErrorMessage = 'image comparison failed';
58

69
/**
710
* @param {object} suites
11+
* @param {string} viewMode
812
* @param {array} errorPatterns
913
* @param {array} filteredBrowsers
1014
* @param {string} [testNameFilter]
1115
* @return {array}
1216
*/
13-
function groupErrors({suites, errorPatterns = [], filteredBrowsers = [], testNameFilter = ''}) {
14-
const testWithErrors = extractErrors(suites);
17+
function groupErrors({suites, viewMode = 'all', errorPatterns = [], filteredBrowsers = [], testNameFilter = ''}) {
18+
const showOnlyFailed = viewMode !== 'all';
19+
const filteredSuites = showOnlyFailed ? filter(suites, isSuiteFailed) : suites;
20+
const testWithErrors = extractErrors(filteredSuites, showOnlyFailed);
1521

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

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

29-
function extractErrors(rootSuites) {
35+
function extractErrors(rootSuites, showOnlyFailed) {
3036
const testWithErrors = {};
3137

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

3743
if (suite.browsers) {
3844
for (const browser of suite.browsers) {
39-
if (isSuccessStatus(browser.result.status)) {
45+
const {status} = browser.result;
46+
if (showOnlyFailed && !isFailStatus(status) && !isErroredStatus(status)) {
4047
continue;
4148
}
4249
const retries = [...browser.retries, browser.result];
@@ -69,7 +76,7 @@ function extractErrorsFromRetries(retries) {
6976
errorsInRetry.add(error.message);
7077
}
7178
if (diffImg) {
72-
errorsInRetry.add('image comparison failed');
79+
errorsInRetry.add(imageComparisonErrorMessage);
7380
}
7481
}
7582
}

lib/static/modules/reducer.js

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ const localStorage = window.localStorage;
1313
function getInitialState(data) {
1414
const {skips, suites, config, total, updated, passed,
1515
failed, skipped, warned, retries, perBrowser, apiValues, gui = false, date} = data;
16-
const {errorPatterns, scaleImages, lazyLoadOffset, defaultView} = config;
16+
const {errorPatterns, scaleImages, lazyLoadOffset, defaultView: viewMode} = config;
1717
const parsedURL = new URL(window.location.href);
1818
const filteredBrowsers = parsedURL.searchParams.getAll('browser');
1919

2020
const formattedSuites = formatSuitesData(suites);
21-
const groupedErrors = groupErrors({suites: formattedSuites.suites, errorPatterns, filteredBrowsers});
21+
const groupedErrors = groupErrors({suites: formattedSuites.suites, viewMode, errorPatterns, filteredBrowsers});
2222

2323
return merge(defaultState, {
2424
gui,
@@ -32,7 +32,7 @@ function getInitialState(data) {
3232
perBrowser
3333
},
3434
view: {
35-
viewMode: defaultView,
35+
viewMode,
3636
scaleImages,
3737
lazyLoadOffset,
3838
..._loadBaseHost(config.baseHost, localStorage),
@@ -53,11 +53,12 @@ export default function reducer(state = getInitialState(compiledData), action) {
5353
config: {scaleImages, lazyLoadOffset}
5454
} = action.payload;
5555
const {errorPatterns} = state.config;
56-
const {filteredBrowsers, testNameFilter} = state.view;
56+
const {filteredBrowsers, testNameFilter, viewMode} = state.view;
5757

5858
const formattedSuites = formatSuitesData(suites);
5959
const groupedErrors = groupErrors({
6060
suites: formattedSuites.suites,
61+
viewMode,
6162
errorPatterns,
6263
filteredBrowsers,
6364
testNameFilter
@@ -79,7 +80,7 @@ export default function reducer(state = getInitialState(compiledData), action) {
7980
}
8081
case actionNames.RUN_ALL_TESTS: {
8182
const suites = clone(state.suites);
82-
Object.values(suites).map(suite => setStatusToAll(suite, action.payload.status));
83+
Object.values(suites).forEach(suite => setStatusToAll(suite, action.payload.status));
8384

8485
// TODO: rewrite store on run all tests
8586
return merge({}, state, {running: true, suites, view: {groupByError: false}});
@@ -145,10 +146,10 @@ export default function reducer(state = getInitialState(compiledData), action) {
145146
return _mutateStateView(state, {expand: 'none'});
146147
}
147148
case actionNames.VIEW_SHOW_ALL: {
148-
return _mutateStateView(state, {viewMode: 'all', expand: 'errors'});
149+
return _mutateViewMode(state, 'all');
149150
}
150151
case actionNames.VIEW_SHOW_FAILED: {
151-
return _mutateStateView(state, {viewMode: 'failed', expand: 'errors'});
152+
return _mutateViewMode(state, 'failed');
152153
}
153154
case actionNames.VIEW_TOGGLE_SKIPPED: {
154155
return _mutateStateView(state, {showSkipped: !state.view.showSkipped});
@@ -173,10 +174,10 @@ export default function reducer(state = getInitialState(compiledData), action) {
173174
const {
174175
suites,
175176
config: {errorPatterns},
176-
view: {filteredBrowsers}
177+
view: {viewMode, filteredBrowsers}
177178
} = state;
178179

179-
const groupedErrors = groupErrors({suites, errorPatterns, filteredBrowsers, testNameFilter});
180+
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});
180181

181182
return {
182183
...state,
@@ -224,7 +225,7 @@ export default function reducer(state = getInitialState(compiledData), action) {
224225
function addTestResult(state, action) {
225226
const {
226227
config: {errorPatterns},
227-
view: {filteredBrowsers, testNameFilter}
228+
view: {viewMode, filteredBrowsers, testNameFilter}
228229
} = state;
229230
const suites = clone(state.suites);
230231

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

251-
const groupedErrors = groupErrors({suites, errorPatterns, filteredBrowsers, testNameFilter});
252+
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});
252253

253254
return assign({}, state, {suiteIds, suites, groupedErrors});
254255
}
@@ -301,6 +302,25 @@ function _mutateStateView(state, mutation) {
301302
return assign(clone(state), {view: newView});
302303
}
303304

305+
function _mutateViewMode(state, viewMode) {
306+
const {
307+
suites,
308+
config: {errorPatterns},
309+
view: {filteredBrowsers, testNameFilter}
310+
} = state;
311+
const groupedErrors = groupErrors({suites, viewMode, errorPatterns, filteredBrowsers, testNameFilter});
312+
313+
return {
314+
...state,
315+
groupedErrors,
316+
view: {
317+
...state.view,
318+
viewMode,
319+
expand: 'errors'
320+
}
321+
};
322+
}
323+
304324
function _loadBaseHost(configuredHost, storage) {
305325
if (!storage) {
306326
return configuredHost;

test/lib/static/modules/group-errors.js

Lines changed: 72 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,80 @@ const {
1010
} = require('../../../utils');
1111
const {mkImg_} = require('../components/utils');
1212

13+
function mkBrowserResultWithStatus(status) {
14+
return mkBrowserResult({
15+
name: `${status} test`,
16+
result: mkTestResult({
17+
status: status
18+
}),
19+
retries: [
20+
mkTestResult({
21+
error: {
22+
message: `message stub ${status}`
23+
}
24+
})
25+
]
26+
});
27+
}
28+
1329
describe('static/modules/group-errors', () => {
14-
it('should not collect errors from success test', () => {
30+
it('should collect errors from all tests if viewMode is "all"', () => {
1531
const suites = [
1632
mkSuiteTree({
1733
browsers: [
18-
mkBrowserResult({
19-
result: mkTestResult({
20-
status: 'success'
21-
}),
22-
retries: [
23-
mkTestResult({
24-
error: {
25-
message: 'message stub'
26-
}
27-
})
28-
]
29-
})
34+
mkBrowserResultWithStatus('skipped'),
35+
mkBrowserResultWithStatus('success'),
36+
mkBrowserResultWithStatus('fail'),
37+
mkBrowserResultWithStatus('error')
3038
]
3139
})
3240
];
3341

34-
const result = groupErrors({suites});
42+
const result = groupErrors({suites, viewMode: 'all'});
43+
44+
assert.lengthOf(result, 4);
45+
assert.include(result[0], {
46+
count: 1,
47+
name: 'message stub error'
48+
});
49+
assert.include(result[1], {
50+
count: 1,
51+
name: 'message stub fail'
52+
});
53+
assert.include(result[2], {
54+
count: 1,
55+
name: 'message stub skipped'
56+
});
57+
assert.include(result[3], {
58+
count: 1,
59+
name: 'message stub success'
60+
});
61+
});
3562

36-
assert.deepEqual(result, []);
63+
it('should collect errors only from failed tests if viewMode is "failed"', () => {
64+
const suites = [
65+
mkSuiteTree({
66+
suite: mkSuite({status: 'error'}),
67+
browsers: [
68+
mkBrowserResultWithStatus('skipped'),
69+
mkBrowserResultWithStatus('success'),
70+
mkBrowserResultWithStatus('fail'),
71+
mkBrowserResultWithStatus('error')
72+
]
73+
})
74+
];
75+
76+
const result = groupErrors({suites, viewMode: 'failed'});
77+
78+
assert.lengthOf(result, 2);
79+
assert.include(result[0], {
80+
count: 1,
81+
name: 'message stub error'
82+
});
83+
assert.include(result[1], {
84+
count: 1,
85+
name: 'message stub fail'
86+
});
3787
});
3888

3989
it('should collect errors from error and imagesInfo[].error', () => {
@@ -82,9 +132,7 @@ describe('static/modules/group-errors', () => {
82132
browsers: [
83133
mkBrowserResult({
84134
result: mkTestResult({
85-
imagesInfo: [
86-
{diffImg: mkImg_()}
87-
]
135+
imagesInfo: [{diffImg: mkImg_()}]
88136
})
89137
})
90138
]
@@ -93,10 +141,12 @@ describe('static/modules/group-errors', () => {
93141

94142
const result = groupErrors({suites});
95143

96-
assert.strictEqual(result.length, 1);
97-
assert.strictEqual(result[0].count, 1);
98-
assert.strictEqual(result[0].name, 'image comparison failed');
99-
assert.strictEqual(result[0].pattern, 'image comparison failed');
144+
assert.lengthOf(result, 1);
145+
assert.include(result[0], {
146+
count: 1,
147+
name: 'image comparison failed',
148+
pattern: 'image comparison failed'
149+
});
100150
});
101151

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

0 commit comments

Comments
 (0)