-
-
Notifications
You must be signed in to change notification settings - Fork 309
/
Copy pathsummaryReporter.ts
124 lines (110 loc) · 3.24 KB
/
summaryReporter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import type {
Logger,
Reporter,
ReporterArgs,
TestSession,
TestSuiteResult,
} from '@web/test-runner-core';
import { reportTestsErrors } from './reportTestsErrors.js';
import { reportTestFileErrors } from './reportTestFileErrors.js';
import { reportBrowserLogs } from './reportBrowserLogs.js';
interface Options {
flatten?: boolean;
}
const color =
([x, y]: [number, number]) =>
(z: string) =>
`\x1b[${x}m${z}\x1b[${y}m${reset}`;
const reset = `\x1b[0m\x1b[0m`;
const green = color([32, 89]);
const red = color([31, 89]);
const dim = color([2, 0]);
/** Test reporter that summarizes all test for a given run */
export function summaryReporter(opts: Options): Reporter {
const { flatten = false } = opts ?? {};
let args: ReporterArgs;
let favoriteBrowser: string;
function logTest(
logger: Logger,
name: string,
passed: boolean,
skipped: boolean,
prefix: string,
postfix = '',
) {
const sign = skipped ? dim('-') : passed ? green('✓') : red('𐄂');
if (flatten) logger.log(`${sign} ${name}${postfix}`);
else logger.log(`${prefix} ${sign} ${name}`);
}
function logSuite(
logger: Logger,
suite: TestSuiteResult,
parent: string,
browserName: string,
) {
let prefix = parent ?? '';
if (flatten) prefix += `${suite.name}`;
else logger.log(`${prefix}${suite.name}${!parent ? browserName : ''}`);
for (const test of suite.tests ?? []) {
logTest(
logger,
flatten && prefix ? `${prefix} ${test.name}` : test.name,
test.passed,
test.skipped,
prefix,
browserName,
);
}
if (!flatten || prefix) prefix += ' '
for (const childSuite of suite.suites ?? []) {
logSuite(logger, childSuite, prefix, browserName);
}
}
function logResults(
logger: Logger,
session: TestSession,
) {
if (session.testResults) {
const browserName = session.browser?.name ? ` ${dim(`[${session.browser.name}]`)}` : '';
const suite = session.testResults;
if (suite.suites.length || suite.tests.length) {
logSuite(logger, suite, '', browserName);
} else {
logger.log(`No tests on ${session.testFile}${browserName}`);
}
}
}
let cachedLogger: Logger;
return {
start(_args) {
args = _args;
favoriteBrowser =
args.browserNames.find(name => {
const n = name.toLowerCase();
return n.includes('chrome') || n.includes('chromium') || n.includes('firefox');
}) ?? args.browserNames[0];
},
reportTestFileResults({ logger, sessionsForTestFile }) {
cachedLogger = logger;
for (const session of sessionsForTestFile) {
logResults(logger, session);
logger.log('');
}
reportBrowserLogs(logger, sessionsForTestFile);
},
onTestRunFinished({ sessions }) {
const failedSessions = sessions.filter(s => !s.passed);
if (failedSessions.length > 0) {
cachedLogger.log('\n\nErrors Reported in Tests:\n\n');
reportTestsErrors(cachedLogger, args.browserNames, favoriteBrowser, failedSessions);
reportTestFileErrors(
cachedLogger,
args.browserNames,
favoriteBrowser,
failedSessions,
true,
);
}
},
};
}