Skip to content

Commit

Permalink
test_runner: expose reporter for use in run api
Browse files Browse the repository at this point in the history
PR-URL: #47238
Fixes: #47231
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
  • Loading branch information
atlowChemi authored and danielleadams committed Jul 6, 2023
1 parent fc6ab26 commit 2091b47
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 1 deletion.
28 changes: 27 additions & 1 deletion doc/api/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,10 @@ test('spies on an object method', (t) => {

<!-- YAML
added: v18.15.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/47238
description: Reporters are now exposed at `node:test/reporters`.
-->

The `node:test` module supports passing [`--test-reporter`][]
Expand All @@ -531,6 +535,16 @@ The following built-reporters are supported:
When `stdout` is a [TTY][], the `spec` reporter is used by default.
Otherwise, the `tap` reporter is used by default.

The reporters are available via the `node:test/reporters` module:

```mjs
import { tap, spec, dot } from 'node:test/reporters';
```

```cjs
const { tap, spec, dot } = require('node:test/reporters');
```

### Custom reporters

[`--test-reporter`][] can be used to specify a path to custom reporter.
Expand Down Expand Up @@ -722,8 +736,20 @@ added: v18.9.0
**Default:** `undefined`.
* Returns: {TestsStream}

```js
```mjs
import { tap } from 'node:test/reporters';
import process from 'node:process';

run({ files: [path.resolve('./tests/test.js')] })
.compose(tap)
.pipe(process.stdout);
```

```cjs
const { tap } = require('node:test/reporters');

run({ files: [path.resolve('./tests/test.js')] })
.compose(tap)
.pipe(process.stdout);
```

Expand Down
38 changes: 38 additions & 0 deletions lib/test/reporters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
'use strict';

const { ObjectDefineProperties } = primordials;

let dot;
let spec;
let tap;

ObjectDefineProperties(module.exports, {
__proto__: null,
dot: {
__proto__: null,
configurable: true,
enumerable: true,
get() {
dot ??= require('internal/test_runner/reporter/dot');
return dot;
},
},
spec: {
__proto__: null,
configurable: true,
enumerable: true,
get() {
spec ??= require('internal/test_runner/reporter/spec');
return spec;
},
},
tap: {
__proto__: null,
configurable: true,
enumerable: true,
get() {
tap ??= require('internal/test_runner/reporter/tap');
return tap;
},
},
});
36 changes: 36 additions & 0 deletions test/parallel/test-runner-run.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as common from '../common/index.mjs';
import * as fixtures from '../common/fixtures.mjs';
import { join } from 'node:path';
import { describe, it, run } from 'node:test';
import { dot, spec, tap } from 'node:test/reporters';
import assert from 'node:assert';

const testFixtures = fixtures.path('test-runner');
Expand Down Expand Up @@ -65,4 +66,39 @@ describe('require(\'node:test\').run', { concurrency: true }, () => {
code: 'ERR_INVALID_ARG_TYPE'
}));
});

it('should be piped with dot', async () => {
const result = await run({ files: [join(testFixtures, 'test/random.cjs')] }).compose(dot).toArray();
assert.deepStrictEqual(result, [
'.',
'\n',
]);
});

it('should be piped with spec', async () => {
const specReporter = new spec();
const result = await run({ files: [join(testFixtures, 'test/random.cjs')] }).compose(specReporter).toArray();
const stringResults = result.map((bfr) => bfr.toString());
assert.match(stringResults[0], /this should pass/);
assert.match(stringResults[1], /tests 1/);
assert.match(stringResults[1], /pass 1/);
});

it('should be piped with tap', async () => {
const result = await run({ files: [join(testFixtures, 'test/random.cjs')] }).compose(tap).toArray();
assert.strictEqual(result.length, 13);
assert.strictEqual(result[0], 'TAP version 13\n');
assert.strictEqual(result[1], '# Subtest: this should pass\n');
assert.strictEqual(result[2], 'ok 1 - this should pass\n');
assert.match(result[3], /duration_ms: \d+\.?\d*/);
assert.strictEqual(result[4], '1..1\n');
assert.strictEqual(result[5], '# tests 1\n');
assert.strictEqual(result[6], '# suites 0\n');
assert.strictEqual(result[7], '# pass 1\n');
assert.strictEqual(result[8], '# fail 0\n');
assert.strictEqual(result[9], '# cancelled 0\n');
assert.strictEqual(result[10], '# skipped 0\n');
assert.strictEqual(result[11], '# todo 0\n');
assert.match(result[12], /# duration_ms \d+\.?\d*/);
});
});

0 comments on commit 2091b47

Please sign in to comment.