Skip to content

Commit

Permalink
Update toThrow() to be able to use Error.cause
Browse files Browse the repository at this point in the history
  • Loading branch information
ibuibu committed Nov 12, 2022
1 parent 7df916a commit 89d160d
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 10 deletions.
57 changes: 48 additions & 9 deletions packages/expect/src/toThrowMatchers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,48 @@ const toThrowExpectedObject = (
thrown: Thrown | null,
expected: Error,
): SyncExpectationResult => {
const pass = thrown !== null && thrown.message === expected.message;
function createMessageAndCause(error: Error): string {
if (error.cause instanceof Error) {
return _createMessageAndCause(error);
} else {
return error.message;
}
}

function _createMessageAndCause(error: Error): string {
if (error.cause instanceof Error) {
return `{ message: ${error.message}, cause: ${_createMessageAndCause(
error.cause,
)}}`;
} else {
return `{ message: ${error.message} }`;
}
}

function expectedMessageAndCause(error: Error) {
return error.cause === undefined
? error.message
: createMessageAndCause(error);
}

function messageAndCause(error: Error) {
return error.cause === undefined ? 'message' : 'message and cause';
}

const pass =
thrown !== null &&
thrown.message === expected.message &&
createMessageAndCause(thrown.value) === createMessageAndCause(expected);

const message = pass
? () =>
// eslint-disable-next-line prefer-template
matcherHint(matcherName, undefined, undefined, options) +
'\n\n' +
formatExpected('Expected message: not ', expected.message) +
formatExpected(
`Expected ${messageAndCause(expected)}: not `,
expectedMessageAndCause(expected),
) +
(thrown !== null && thrown.hasMessage
? formatStack(thrown)
: formatReceived('Received value: ', thrown, 'value'))
Expand All @@ -242,22 +276,27 @@ const toThrowExpectedObject = (
'\n\n' +
(thrown === null
? // eslint-disable-next-line prefer-template
formatExpected('Expected message: ', expected.message) +
formatExpected(
`Expected ${messageAndCause(expected)}: `,
expectedMessageAndCause(expected),
) +
'\n' +
DID_NOT_THROW
: thrown.hasMessage
? // eslint-disable-next-line prefer-template
printDiffOrStringify(
expected.message,
thrown.message,
'Expected message',
'Received message',
createMessageAndCause(expected),
createMessageAndCause(thrown.value),
`Expected ${messageAndCause(expected)}`,
`Received ${messageAndCause(thrown.value)}`,
true,
) +
'\n' +
formatStack(thrown)
: formatExpected('Expected message: ', expected.message) +
formatReceived('Received value: ', thrown, 'value'));
: formatExpected(
`Expected ${messageAndCause}: `,
expectedMessageAndCause,
) + formatReceived('Received value: ', thrown, 'value'));

return {message, pass};
};
Expand Down
2 changes: 1 addition & 1 deletion packages/expect/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"lib": ["es2020", "dom"],
"lib": ["es2022", "dom"],
"rootDir": "src",
"outDir": "build"
},
Expand Down

0 comments on commit 89d160d

Please sign in to comment.