mirror of
https://github.com/nodejs/node.git
synced 2025-05-03 02:06:12 +00:00

This makes sure the stack trace is not removed due to a wrong stack start function being used. It also fixes the wrong operator caused by the same reason. This only applies in case an validation object was used to validate the rejection passed to `assert.reject()` as first argument. PR-URL: https://github.com/nodejs/node/pull/27047 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
151 lines
4.8 KiB
JavaScript
151 lines
4.8 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
|
|
// Test assert.rejects() and assert.doesNotReject() by checking their
|
|
// expected output and by verifying that they do not work sync
|
|
|
|
// Run all tests in parallel and check their outcome at the end.
|
|
const promises = [];
|
|
|
|
// Check `assert.rejects`.
|
|
{
|
|
const rejectingFn = async () => assert.fail();
|
|
const errObj = {
|
|
code: 'ERR_ASSERTION',
|
|
name: 'AssertionError',
|
|
message: 'Failed'
|
|
};
|
|
// `assert.rejects` accepts a function or a promise as first argument.
|
|
promises.push(assert.rejects(rejectingFn, errObj));
|
|
promises.push(assert.rejects(rejectingFn(), errObj));
|
|
}
|
|
|
|
{
|
|
const handler = (err) => {
|
|
assert(err instanceof assert.AssertionError,
|
|
`${err.name} is not instance of AssertionError`);
|
|
assert.strictEqual(err.code, 'ERR_ASSERTION');
|
|
assert.strictEqual(err.message,
|
|
'Missing expected rejection (mustNotCall).');
|
|
assert.strictEqual(err.operator, 'rejects');
|
|
assert.ok(!err.stack.includes('at Function.rejects'));
|
|
return true;
|
|
};
|
|
|
|
let promise = assert.rejects(async () => {}, common.mustNotCall());
|
|
promises.push(assert.rejects(promise, common.mustCall(handler)));
|
|
|
|
promise = assert.rejects(() => {}, common.mustNotCall());
|
|
promises.push(assert.rejects(promise, {
|
|
name: 'TypeError',
|
|
code: 'ERR_INVALID_RETURN_VALUE',
|
|
message: 'Expected instance of Promise to be returned ' +
|
|
'from the "promiseFn" function but got type undefined.'
|
|
}));
|
|
|
|
promise = assert.rejects(Promise.resolve(), common.mustNotCall());
|
|
promises.push(assert.rejects(promise, common.mustCall(handler)));
|
|
}
|
|
|
|
{
|
|
const THROWN_ERROR = new Error();
|
|
|
|
promises.push(assert.rejects(() => {
|
|
throw THROWN_ERROR;
|
|
}, {}).catch(common.mustCall((err) => {
|
|
assert.strictEqual(err, THROWN_ERROR);
|
|
})));
|
|
}
|
|
|
|
promises.push(assert.rejects(
|
|
assert.rejects('fail', {}),
|
|
{
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
message: 'The "promiseFn" argument must be one of type ' +
|
|
'Function or Promise. Received type string'
|
|
}
|
|
));
|
|
|
|
// Check `assert.doesNotReject`.
|
|
{
|
|
// `assert.doesNotReject` accepts a function or a promise as first argument.
|
|
const promise = assert.doesNotReject(() => new Map(), common.mustNotCall());
|
|
promises.push(assert.rejects(promise, {
|
|
message: 'Expected instance of Promise to be returned ' +
|
|
'from the "promiseFn" function but got instance of Map.',
|
|
code: 'ERR_INVALID_RETURN_VALUE',
|
|
name: 'TypeError'
|
|
}));
|
|
promises.push(assert.doesNotReject(async () => {}));
|
|
promises.push(assert.doesNotReject(Promise.resolve()));
|
|
}
|
|
|
|
{
|
|
const handler1 = (err) => {
|
|
assert(err instanceof assert.AssertionError,
|
|
`${err.name} is not instance of AssertionError`);
|
|
assert.strictEqual(err.code, 'ERR_ASSERTION');
|
|
assert.strictEqual(err.message, 'Failed');
|
|
return true;
|
|
};
|
|
const handler2 = (err) => {
|
|
assert(err instanceof assert.AssertionError,
|
|
`${err.name} is not instance of AssertionError`);
|
|
assert.strictEqual(err.code, 'ERR_ASSERTION');
|
|
assert.strictEqual(err.message,
|
|
'Got unwanted rejection.\nActual message: "Failed"');
|
|
assert.strictEqual(err.operator, 'doesNotReject');
|
|
assert.ok(err.stack);
|
|
assert.ok(!err.stack.includes('at Function.doesNotReject'));
|
|
return true;
|
|
};
|
|
|
|
const rejectingFn = async () => assert.fail();
|
|
|
|
let promise = assert.doesNotReject(rejectingFn, common.mustCall(handler1));
|
|
promises.push(assert.rejects(promise, common.mustCall(handler2)));
|
|
|
|
promise = assert.doesNotReject(rejectingFn(), common.mustCall(handler1));
|
|
promises.push(assert.rejects(promise, common.mustCall(handler2)));
|
|
|
|
promise = assert.doesNotReject(() => assert.fail(), common.mustNotCall());
|
|
promises.push(assert.rejects(promise, common.mustCall(handler1)));
|
|
}
|
|
|
|
promises.push(assert.rejects(
|
|
assert.doesNotReject(123),
|
|
{
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
message: 'The "promiseFn" argument must be one of type ' +
|
|
'Function or Promise. Received type number'
|
|
}
|
|
));
|
|
|
|
{
|
|
const handler = (generated, actual, err) => {
|
|
assert.strictEqual(err.generatedMessage, generated);
|
|
assert.strictEqual(err.code, 'ERR_ASSERTION');
|
|
assert.strictEqual(err.actual, actual);
|
|
assert.strictEqual(err.operator, 'rejects');
|
|
assert(/rejects/.test(err.stack));
|
|
return true;
|
|
};
|
|
const err = new Error();
|
|
promises.push(assert.rejects(
|
|
assert.rejects(Promise.reject(null), { code: 'FOO' }),
|
|
handler.bind(null, true, null)
|
|
));
|
|
promises.push(assert.rejects(
|
|
assert.rejects(Promise.reject(5), { code: 'FOO' }, 'AAAAA'),
|
|
handler.bind(null, false, 5)
|
|
));
|
|
promises.push(assert.rejects(
|
|
assert.rejects(Promise.reject(err), { code: 'FOO' }, 'AAAAA'),
|
|
handler.bind(null, false, err)
|
|
));
|
|
}
|
|
|
|
// Make sure all async code gets properly executed.
|
|
Promise.all(promises).then(common.mustCall());
|