Skip to content

Commit 6afb966

Browse files
committed
fix(summaryReporter): fix nested suites on report
1 parent 1abf439 commit 6afb966

File tree

3 files changed

+81
-36
lines changed

3 files changed

+81
-36
lines changed

packages/test-runner-mocha/src/collectTestResults.ts

+16-8
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ export function collectTestResults(mocha: BrowserMocha) {
4242
...(test.duration !== undefined && { duration: test.duration }),
4343
error: err
4444
? {
45-
name: err.name,
46-
message: err.message,
47-
stack: err.stack,
48-
expected: err.expected,
49-
actual: err.actual,
50-
}
45+
name: err.name,
46+
message: err.message,
47+
stack: err.stack,
48+
expected: err.expected,
49+
actual: err.actual,
50+
}
5151
: undefined,
5252
});
5353
}
@@ -65,8 +65,16 @@ export function collectTestResults(mocha: BrowserMocha) {
6565

6666
return { name: suite.title, suites, tests };
6767
}
68-
69-
const testResults = getSuiteResults(mocha.suite);
68+
let testResults;
69+
if (mocha.suite.suites.length == 1 && mocha.suite.tests.length == 0) {
70+
collectHooks((mocha.suite as any)._beforeAll as Hook[]);
71+
collectHooks((mocha.suite as any)._afterAll as Hook[]);
72+
collectHooks((mocha.suite as any)._beforeEach as Hook[]);
73+
collectHooks((mocha.suite as any)._afterEach as Hook[]);
74+
testResults = getSuiteResults(mocha.suite.suites[0]);
75+
} else {
76+
testResults = getSuiteResults(mocha.suite);
77+
}
7078

7179
return { testResults, hookErrors, passed };
7280
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { expect } from './chai.js';
2+
import './shared-a.js';
3+
4+
describe('Root suite test', () => {
5+
it('test 1', () => {
6+
expect(true).to.be.true;
7+
});
8+
9+
it('test 2', () => {
10+
expect('foo').to.be.a('string');
11+
});
12+
13+
describe('Nested suite test', () => {
14+
it('test 3', () => {
15+
expect(true).to.be.true;
16+
});
17+
18+
it('test 4', () => {
19+
expect('foo').to.be.a('string');
20+
});
21+
22+
describe('Nested suite test, level 2', () => {
23+
it('test 5', () => {
24+
expect(true).to.be.true;
25+
});
26+
it('test 6', () => {
27+
expect('foo').to.be.a('string');
28+
});
29+
});
30+
});
31+
});

packages/test-runner/src/reporter/summaryReporter.ts

+34-28
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type {
2-
BrowserLauncher,
32
Logger,
43
Reporter,
54
ReporterArgs,
5+
TestSession,
66
TestSuiteResult,
77
} from '@web/test-runner-core';
88

@@ -17,8 +17,8 @@ interface Options {
1717

1818
const color =
1919
([x, y]: [number, number]) =>
20-
(z: string) =>
21-
`\x1b[${x}m${z}\x1b[${y}m${reset}`;
20+
(z: string) =>
21+
`\x1b[${x}m${z}\x1b[${y}m${reset}`;
2222
const reset = `\x1b[0m\x1b[0m`;
2323
const green = color([32, 89]);
2424
const red = color([31, 89]);
@@ -30,54 +30,60 @@ export function summaryReporter(opts: Options): Reporter {
3030
let args: ReporterArgs;
3131
let favoriteBrowser: string;
3232

33-
function log(
33+
function logTest(
3434
logger: Logger,
3535
name: string,
3636
passed: boolean,
3737
skipped: boolean,
38-
prefix = ' ',
38+
prefix: string,
3939
postfix = '',
4040
) {
4141
const sign = skipped ? dim('-') : passed ? green('✓') : red('𐄂');
4242
if (flatten) logger.log(`${sign} ${name}${postfix}`);
43-
else logger.log(`${prefix} ${sign} ${name}`);
43+
else logger.log(`${prefix} ${sign} ${name}`);
4444
}
4545

46-
function logResults(
46+
function logSuite(
4747
logger: Logger,
48-
results?: TestSuiteResult,
49-
prefix?: string,
50-
browser?: BrowserLauncher,
48+
suite: TestSuiteResult,
49+
parent: string,
50+
browserName: string,
5151
) {
52-
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
53-
for (const result of results?.tests ?? []) {
54-
log(
52+
let prefix = parent ?? '';
53+
if (flatten) prefix += `${suite.name}`;
54+
else logger.log(`${prefix}${suite.name}${!parent ? browserName : ''}`);
55+
56+
for (const test of suite.tests ?? []) {
57+
logTest(
5558
logger,
56-
flatten ? `${prefix ?? ''} ${result.name}` : result.name,
57-
result.passed,
58-
result.skipped,
59+
flatten && prefix ? `${prefix} ${test.name}` : test.name,
60+
test.passed,
61+
test.skipped,
5962
prefix,
6063
browserName,
6164
);
6265
}
6366

64-
for (const suite of results?.suites ?? []) {
65-
logSuite(logger, suite, prefix, browser);
67+
if (!flatten || prefix) prefix += ' '
68+
for (const childSuite of suite.suites ?? []) {
69+
logSuite(logger, childSuite, prefix, browserName);
6670
}
6771
}
6872

69-
function logSuite(
73+
function logResults(
7074
logger: Logger,
71-
suite: TestSuiteResult,
72-
parent?: string,
73-
browser?: BrowserLauncher,
75+
session: TestSession,
7476
) {
75-
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
76-
let pref = parent ? `${parent} ` : ' ';
77-
if (flatten) pref += `${suite.name}`;
78-
else logger.log(`${pref}${suite.name}${browserName}`);
77+
if (session.testResults) {
78+
const browserName = session.browser?.name ? ` ${dim(`[${session.browser.name}]`)}` : '';
79+
const suite = session.testResults;
7980

80-
logResults(logger, suite, pref, browser);
81+
if (suite.suites.length || suite.tests.length) {
82+
logSuite(logger, suite, '', browserName);
83+
} else {
84+
logger.log(`No tests on ${session.testFile}${browserName}`);
85+
}
86+
}
8187
}
8288

8389
let cachedLogger: Logger;
@@ -94,7 +100,7 @@ export function summaryReporter(opts: Options): Reporter {
94100
reportTestFileResults({ logger, sessionsForTestFile }) {
95101
cachedLogger = logger;
96102
for (const session of sessionsForTestFile) {
97-
logResults(logger, session.testResults, '', session.browser);
103+
logResults(logger, session);
98104
logger.log('');
99105
}
100106
reportBrowserLogs(logger, sessionsForTestFile);

0 commit comments

Comments
 (0)