Skip to content

Commit

Permalink
test_runner: add extra fields in AssertionError YAML
Browse files Browse the repository at this point in the history
Many TAP reporters offer special-case handling of YAML objects
containing `expected`, `actual`, and `operator` fields, as produced by
`AssertionError` and similar userland Error classes.

PR-URL: #44952
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
bengl authored Oct 26, 2022
1 parent 0a7ba84 commit e260b37
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
25 changes: 25 additions & 0 deletions lib/internal/test_runner/tap_stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,17 +179,30 @@ function jsToYaml(indent, name, value) {
code,
failureType,
message,
expected,
actual,
operator,
stack,
} = value;
let errMsg = message ?? '<unknown error>';
let errStack = stack;
let errCode = code;
let errExpected = expected;
let errActual = actual;
let errOperator = operator;
let errIsAssertion = isAssertionLike(value);

// If the ERR_TEST_FAILURE came from an error provided by user code,
// then try to unwrap the original error message and stack.
if (code === 'ERR_TEST_FAILURE' && kUnwrapErrors.has(failureType)) {
errStack = cause?.stack ?? errStack;
errCode = cause?.code ?? errCode;
if (isAssertionLike(cause)) {
errExpected = cause.expected;
errActual = cause.actual;
errOperator = cause.operator ?? errOperator;
errIsAssertion = true;
}
if (failureType === kTestCodeFailure) {
errMsg = cause?.message ?? errMsg;
}
Expand All @@ -201,6 +214,14 @@ function jsToYaml(indent, name, value) {
result += jsToYaml(indent, 'code', errCode);
}

if (errIsAssertion) {
result += jsToYaml(indent, 'expected', errExpected);
result += jsToYaml(indent, 'actual', errActual);
if (errOperator) {
result += jsToYaml(indent, 'operator', errOperator);
}
}

if (typeof errStack === 'string') {
const frames = [];

Expand Down Expand Up @@ -229,4 +250,8 @@ function jsToYaml(indent, name, value) {
return result;
}

function isAssertionLike(value) {
return value && typeof value === 'object' && 'expected' in value && 'actual' in value;
}

module.exports = { TapStream };
3 changes: 3 additions & 0 deletions test/message/test_runner_describe_it.out
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ not ok 13 - async assertion fail
true !== false

code: 'ERR_ASSERTION'
expected: false
actual: true
operator: 'strictEqual'
stack: |-
*
*
Expand Down
3 changes: 3 additions & 0 deletions test/message/test_runner_output.out
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ not ok 13 - async assertion fail
true !== false

code: 'ERR_ASSERTION'
expected: false
actual: true
operator: 'strictEqual'
stack: |-
*
*
Expand Down

0 comments on commit e260b37

Please sign in to comment.