-
-
Notifications
You must be signed in to change notification settings - Fork 304
/
Copy pathsummaryReporter.ts
118 lines (105 loc) · 3.12 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
import type {
BrowserLauncher,
Logger,
Reporter,
ReporterArgs,
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 log(
logger: Logger,
name: string,
passed: boolean,
skipped: boolean,
prefix = ' ',
postfix = '',
) {
const sign = skipped ? dim('-') : passed ? green('✓') : red('𐄂');
if (flatten) logger.log(`${sign} ${name}${postfix}`);
else logger.log(`${prefix} ${sign} ${name}`);
}
function logResults(
logger: Logger,
results?: TestSuiteResult,
prefix?: string,
browser?: BrowserLauncher,
) {
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
for (const result of results?.tests ?? []) {
log(
logger,
flatten ? `${prefix ?? ''} ${result.name}` : result.name,
result.passed,
result.skipped,
prefix,
browserName,
);
}
for (const suite of results?.suites ?? []) {
logSuite(logger, suite, prefix, browser);
}
}
function logSuite(
logger: Logger,
suite: TestSuiteResult,
parent?: string,
browser?: BrowserLauncher,
) {
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
let pref = parent ? `${parent} ` : ' ';
if (flatten) pref += `${suite.name}`;
else logger.log(`${pref}${suite.name}${browserName}`);
logResults(logger, suite, pref, browser);
}
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.testResults, '', session.browser);
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,
);
}
},
};
}