Skip to content

Commit feb1bd4

Browse files
committed
Add a summary reporter for tests
1 parent 59d59b1 commit feb1bd4

File tree

8 files changed

+95
-32
lines changed

8 files changed

+95
-32
lines changed

lib/vitest-reporter/build.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

lib/vitest-reporter/dist.cjs

Lines changed: 0 additions & 1 deletion
This file was deleted.

lib/vitest-reporter/package.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@
44
"version": "1.0.0",
55
"type": "module",
66
"dependencies": {
7-
"istanbul-lib-report": "^3.0.1"
7+
"istanbul-lib-report": "^3.0.1",
8+
"vitest": "^3.2.3"
89
},
910
"devDependencies": {
10-
"@sourceacademy/modules-repotools": "workspace:^",
1111
"@types/istanbul-lib-report": "^3.0.3",
12+
"esbuild": "^0.25.8",
1213
"typescript": "^5.8.2"
1314
},
1415
"exports": {
15-
".": "./dist.cjs"
16+
"./coverage-reporter": "./dist/coverage-reporter.cjs",
17+
"./test-reporter": "./dist/test-reporter.js"
1618
},
1719
"scripts": {
18-
"build": "node ./build.js"
20+
"build": "yarn build:coverage-reporter && yarn build:test-reporter",
21+
"build:coverage-reporter": "esbuild --outfile=./dist/coverage-reporter.cjs --format=cjs --bundle=true --external:\"istanbul-lib-report\" --platform=node src/coverage-reporter.cts",
22+
"build:test-reporter": "esbuild --outfile=./dist/test-reporter.js --format=esm --bundle=true --external:\"vitest*\" --platform=node src/test-reporter.ts"
1923
}
2024
}
File renamed without changes.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import fs from 'fs';
2+
import type { RunnerTestFile, TestCase, TestModule, TestSuite, Vitest } from 'vitest/node';
3+
import { BasicReporter } from 'vitest/reporters';
4+
5+
function* formatTestCase(testCase: TestCase, prefixes: string[]) {
6+
const passed = testCase.ok();
7+
const diagnostics = testCase.diagnostic();
8+
const durationStr = diagnostics ? `${diagnostics.duration}ms` : '';
9+
10+
if (prefixes.length > 0) {
11+
yield `- ${passed ? '✅' : '❌'} ${prefixes.join(' > ')} > ${testCase.name} ${durationStr}`;
12+
} else {
13+
yield `- ${passed ? '✅' : '❌'} ${testCase.name} ${durationStr}`;
14+
}
15+
}
16+
17+
function* formatTestSuite(suite: TestSuite, prefixes: string[]): Generator<string> {
18+
const suiteName = suite.name;
19+
20+
for (const child of suite.children) {
21+
if (child.type === 'suite') {
22+
yield* formatTestSuite(child, [...prefixes, suiteName]);
23+
} else {
24+
yield* formatTestCase(child, [...prefixes, suiteName]);
25+
}
26+
}
27+
}
28+
29+
function getTestCount(item: TestModule | TestSuite | TestCase): number {
30+
if (item.type === 'test') return 1;
31+
32+
let output = 0;
33+
for (const child of item.children) {
34+
output += getTestCount(child);
35+
}
36+
37+
return output;
38+
}
39+
40+
export default class GithubActionsSummaryReporter extends BasicReporter {
41+
private writeStream: fs.WriteStream | null = null;
42+
private vitest: Vitest | null = null;
43+
44+
onInit(vitest: Vitest) {
45+
this.vitest = vitest;
46+
47+
if (process.env.GITHUB_STEP_SUMMARY) {
48+
this.writeStream = fs.createWriteStream(process.env.GITHUB_STEP_SUMMARY, { encoding: 'utf-8', flags: 'a' });
49+
}
50+
}
51+
52+
onTestRunEnd(files: RunnerTestFile[]) {
53+
if (!this.writeStream) return;
54+
55+
this.writeStream.write('<h3>Test Results</h3>');
56+
for (const file of files) {
57+
const testModule = this.vitest!.state.getReportedEntity(file) as TestModule;
58+
const passed = testModule.ok();
59+
const testCount = getTestCount(testModule);
60+
61+
this.writeStream.write(`${passed ? '✅' : '❌'} \`${file.filepath}\` (${testCount} test${testCount === 1 ? '' : 's'}) \n`);
62+
63+
for (const child of testModule.children) {
64+
const formatter = child.type === 'suite' ? formatTestSuite(child, []) : formatTestCase(child, []);
65+
const line = Array.from(formatter).join('');
66+
this.writeStream.write(line);
67+
}
68+
}
69+
70+
this.writeStream.close();
71+
}
72+
}

lib/vitest-reporter/tsconfig.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// Repotools regular tsconfig
22
{
33
"extends": ["../tsconfig.json"],
4-
"include": ["./index.cts"],
4+
"include": ["src"],
55
"compilerOptions": {
6-
"module": "commonjs",
7-
"moduleResolution": "node",
6+
"module": "nodenext",
7+
"moduleResolution": "nodenext",
88
"verbatimModuleSyntax": false
99
}
1010
}

vitest.config.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22
// Root vitest config
33
import pathlib from 'path';
44
import { coverageConfigDefaults, defineConfig } from 'vitest/config';
5+
import GithubActionsSummaryReporter from './lib/vitest-reporter/dist/test-reporter.js';
56

67
const coverageReporters = ['text'];
8+
9+
/**
10+
* @type {Exclude<import('vitest/config').ViteUserConfig['test'], undefined>['reporters']}
11+
*/
12+
const testReporters = ['default'];
13+
714
if (process.env.GITHUB_ACTIONS) {
8-
const reporter = pathlib.resolve(import.meta.dirname, './lib/vitest-reporter/dist.cjs');
15+
const reporter = pathlib.resolve(import.meta.dirname, './lib/vitest-reporter/dist/coverage-reporter.cjs');
916
coverageReporters.push(reporter);
17+
testReporters.push(new GithubActionsSummaryReporter());
1018
} else {
1119
coverageReporters.push('html');
1220
}
@@ -26,6 +34,7 @@ export default defineConfig({
2634
'./src/bundles/*',
2735
'./src/tabs/*'
2836
],
37+
reporters: testReporters,
2938
clearMocks: true,
3039
coverage: {
3140
provider: 'v8',

yarn.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4108,10 +4108,11 @@ __metadata:
41084108
version: 0.0.0-use.local
41094109
resolution: "@sourceacademy/vitest-reporter@workspace:lib/vitest-reporter"
41104110
dependencies:
4111-
"@sourceacademy/modules-repotools": "workspace:^"
41124111
"@types/istanbul-lib-report": "npm:^3.0.3"
4112+
esbuild: "npm:^0.25.8"
41134113
istanbul-lib-report: "npm:^3.0.1"
41144114
typescript: "npm:^5.8.2"
4115+
vitest: "npm:^3.2.3"
41154116
languageName: unknown
41164117
linkType: soft
41174118

0 commit comments

Comments
 (0)