Skip to content

Commit 4c510a4

Browse files
committed
test_runner: fix passing expectFailure
1 parent 79ddd1b commit 4c510a4

10 files changed

Lines changed: 72 additions & 5 deletions

lib/internal/test_runner/test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ const kParentAlreadyFinished = 'parentAlreadyFinished';
8282
const kSubtestsFailed = 'subtestsFailed';
8383
const kTestCodeFailure = 'testCodeFailure';
8484
const kTestTimeoutFailure = 'testTimeoutFailure';
85+
const kExpectedFailure = 'expectedFailure';
8586
const kHookFailure = 'hookFailed';
8687
const kDefaultTimeout = null;
8788
const noop = FunctionPrototype;
@@ -957,6 +958,14 @@ class Test extends AsyncResource {
957958
}
958959

959960
pass() {
961+
if (this.error == null && this.expectFailure === true) {
962+
this.passed = false;
963+
this.error = new ERR_TEST_FAILURE(
964+
'test was expected to fail but passed',
965+
kExpectedFailure,
966+
);
967+
return;
968+
}
960969
if (this.error !== null) {
961970
return;
962971
}

test/fixtures/test-runner/output/describe_it.snapshot

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,14 @@ ok 10 - sync skip pass # SKIP
8484
type: 'test'
8585
...
8686
# Subtest: sync skip expect fail
87-
ok 11 - sync skip expect fail # SKIP
87+
not ok 11 - sync skip expect fail # SKIP
8888
---
8989
duration_ms: *
9090
type: 'test'
91+
location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):4'
92+
failureType: 'expectedFailure'
93+
error: 'test was expected to fail but passed'
94+
code: 'ERR_TEST_FAILURE'
9195
...
9296
# Subtest: sync skip pass with message
9397
ok 12 - sync skip pass with message # SKIP this is skipped

test/fixtures/test-runner/output/dot_reporter.snapshot

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
........XX...X..XXX.
1+
.....X..XX...X..XXX.
22
X.....XXX...........
33
.X.........X...XXX.X
44
X.....XXXXXXX...XXXX
55
X
66

77
Failed tests:
88

9+
﹣ sync skip expect fail (*ms) # SKIP
10+
'test was expected to fail but passed'
911
✖ sync fail todo (*ms) # TODO
1012
Error: thrown from sync fail todo
1113
*

test/fixtures/test-runner/output/junit_reporter.snapshot

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
<testcase name="sync todo with expect fail" time="*" classname="test" file="*">
88
<skipped type="todo" message="true"/>
99
</testcase>
10-
<testcase name="sync skip expect fail" time="*" classname="test" file="*">
10+
<testcase name="sync skip expect fail" time="*" classname="test" file="*" failure="test was expected to fail but passed">
1111
<skipped type="skipped" message="true"/>
12+
<failure type="expectedFailure" message="test was expected to fail but passed">
13+
[Error [ERR_TEST_FAILURE]: test was expected to fail but passed] { code: 'ERR_TEST_FAILURE', failureType: 'expectedFailure', cause: 'test was expected to fail but passed' }
14+
</failure>
1215
</testcase>
1316
<testcase name="sync pass todo" time="*" classname="test" file="*">
1417
<skipped type="todo" message="true"/>

test/fixtures/test-runner/output/output.snapshot

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@ ok 5 - sync todo with expect fail # TODO
3030
type: 'test'
3131
...
3232
# Subtest: sync skip expect fail
33-
ok 6 - sync skip expect fail # SKIP
33+
not ok 6 - sync skip expect fail # SKIP
3434
---
3535
duration_ms: *
3636
type: 'test'
37+
location: '/test/fixtures/test-runner/output/output.js:(LINE):6'
38+
failureType: 'expectedFailure'
39+
error: 'test was expected to fail but passed'
40+
code: 'ERR_TEST_FAILURE'
3741
...
3842
# Subtest: sync pass todo
3943
ok 7 - sync pass todo # TODO

test/fixtures/test-runner/output/output_cli.snapshot

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@ ok 5 - sync todo with expect fail # TODO
3030
type: 'test'
3131
...
3232
# Subtest: sync skip expect fail
33-
ok 6 - sync skip expect fail # SKIP
33+
not ok 6 - sync skip expect fail # SKIP
3434
---
3535
duration_ms: *
3636
type: 'test'
37+
location: '/test/fixtures/test-runner/output/output.js:(LINE):6'
38+
failureType: 'expectedFailure'
39+
error: 'test was expected to fail but passed'
40+
code: 'ERR_TEST_FAILURE'
3741
...
3842
# Subtest: sync pass todo
3943
ok 7 - sync pass todo # TODO

test/fixtures/test-runner/output/spec_reporter.snapshot

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@
105105

106106
failing tests:
107107

108+
*
109+
sync skip expect fail (*ms) # SKIP
110+
'test was expected to fail but passed'
111+
108112
*
109113
sync fail todo (*ms) # TODO
110114
Error: thrown from sync fail todo

test/fixtures/test-runner/output/spec_reporter_cli.snapshot

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@
108108

109109
failing tests:
110110

111+
*
112+
sync skip expect fail (*ms) # SKIP
113+
'test was expected to fail but passed'
114+
111115
*
112116
sync fail todo (*ms) # TODO
113117
Error: thrown from sync fail todo
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('node:assert');
4+
const { run, test } = require('node:test');
5+
6+
if (!process.env.NODE_TEST_CONTEXT) {
7+
const stream = run({ files: [__filename] });
8+
9+
stream.on('test:pass', common.mustNotCall());
10+
stream.on('test:fail', common.mustCall((event) => {
11+
assert.strictEqual(event.expectFailure, true);
12+
assert.strictEqual(event.details.error.code, 'ERR_TEST_FAILURE');
13+
assert.strictEqual(event.details.error.failureType, 'expectedFailure');
14+
assert.strictEqual(event.details.error.cause, 'test was expected to fail but passed');
15+
}, 1));
16+
} else {
17+
test('passing test', { expectFailure: true }, () => {});
18+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('node:assert');
4+
const { run, test } = require('node:test');
5+
6+
if (!process.env.NODE_TEST_CONTEXT) {
7+
const stream = run({ files: [__filename] });
8+
9+
stream.on('test:fail', common.mustNotCall());
10+
stream.on('test:pass', common.mustCall((event) => {
11+
assert.strictEqual(event.expectFailure, true);
12+
}, 1));
13+
} else {
14+
test('failing test', { expectFailure: true }, () => assert.fail('should not pass'));
15+
}

0 commit comments

Comments
 (0)