UNPKG

muggle-assert

Version:

A simplification of the node assert library for use with muggle

363 lines (313 loc) 9.64 kB
const test = require('muggle-test') const assert = require('./index.js') // AssertionError tests test('AssertionError properties should be set correctly', () => { const error = new assert.AssertionError({ message: 'penguins', operator: `('v')`, expected: 'food', actual: 'snow' }) assert.equal(error.name, 'AssertionError') assert.equal(error.message, 'penguins') assert.equal(error.operator, `('v')`) assert.equal(error.expected, 'food') assert.equal(error.actual, 'snow') }) test('An AssertionError should be an instance of AssertionError and Error', () => { const error = new assert.AssertionError() assert(error instanceof Error, 'error should be an instance of Error') assert(error instanceof assert.AssertionError, 'error should be an instance of AssertionError') }) test('stackStartFn should trim stack correctly', () => { let firstError let secondError function base () { function nested () { firstError = new assert.AssertionError({ stackStartFn: base }) function nested2 () { secondError = new assert.AssertionError({ stackStartFn: base }) } nested2() } nested() } base() assert.equal(firstError.stack, secondError.stack) }) // end of AssertionError Tests // --------------------------- // assert() tests test('assert() should pass if truthy', () => { assert(true, 'true') assert(10 > 2, '10 > 2') assert({}, '{}') assert([], '[]') assert(100, '100') assert('string', `'string'`) assert(new Date(), 'new Date()') }) test('assert() should throw if falsy', () => { assert.throws( () => assert(false), new assert.AssertionError({ message: '<Unnamed Assert>', operator: 'true' }) ) assert.throws(() => assert(2 > 10), '2 < 10') assert.throws(() => assert(null), 'null') assert.throws(() => assert(undefined), 'undefined') assert.throws(() => assert(0), '0') assert.throws(() => assert(NaN), 'NaN') assert.throws(() => assert(''), `empty string`) }) test('assert() should include custom message in AssertionError', () => { assert.throws( () => assert(false, 'custom message'), new assert.AssertionError({ message: 'custom message', operator: 'true' }) ) }) // end of assert() tests // --------------------------- // assert.equal() tests test('.equal() should pass if equal', () => { assert.equal('string', 'string') assert.equal(100, 100) assert.equal(Infinity, Infinity) assert.equal(null, null) assert.equal(undefined, undefined) assert.equal(false, false) assert.equal(true, true) assert.equal([1, 2, 3], [1, 2, 3]) assert.equal({ a: 'a', b: 'b', c: 'c' }, { c: 'c', b: 'b', a: 'a' }) assert.equal(Buffer.from('012345'), Buffer.from('012345')) assert.equal(new Set([1, 1, 2, 3]), new Set([1, 2, 2, 3])) assert.equal(new Map([[1, 'first'], [2, 'second']]), new Map([[1, 'first'], [2, 'second']])) }) test('.equal() should throw if not equal', () => { assert.throws( () => assert.equal('actual', 'expected'), new assert.AssertionError({ message: 'should be equal', actual: 'actual', expected: 'expected', operator: 'deepEqual' }), 'should throw correctly formatted error with inequal strings' ) assert.throws(() => assert.equal(100, -50), 'numbers') assert.throws(() => assert.equal(Infinity, -Infinity), 'positive and negative Infinity') assert.throws(() => assert.equal(true, false), 'true and false') assert.throws(() => { assert.equal( { key: 'value' }, { key: 'other value' } ) }, 'objects') assert.throws(() => assert.equal([1, 2, 3], [3, 2, 1]), 'arrays') assert.throws(() => assert.equal(Buffer.from('012345'), Buffer.from('543210')), 'Buffers') assert.throws(() => assert.equal(new Set([1, 2, 3]), new Set([3, 2, 1])), 'Sets') assert.throws(() => { assert.equal( new Map([[1, 'first'], [2, 'second']]), new Map([[2, 'second'], [1, 'first']]) ) }, 'Maps') }) test('.equal() should include custom message in AssertionError', () => { assert.throws( () => assert.equal('actual', 'expected', 'custom message'), new assert.AssertionError({ message: 'custom message', actual: 'actual', expected: 'expected', operator: 'deepEqual' }) ) }) test('.equal() should use strict equality', () => { assert.throws(() => assert.equal(2, '2'), `2 and '2'`) assert.throws(() => assert.equal('', false), `false and ''`) assert.throws(() => assert.equal('', 0), `'' and 0`) assert.throws(() => assert.equal(undefined, null), `undefined and null`) assert.throws(() => assert.equal(0, false), `0 and false`) assert.throws(() => assert.equal('0', false), `'0' and false`) assert.throws(() => assert.equal(1, true), `1 and true`) assert.throws(() => assert.equal('1', true), `'1' and true`) }) // end of assert.equal() tests // --------------------------- // assert.throws() tests test('.throws() should pass if error is thrown', () => { assert.throws(() => { throw new Error() }) }) test('.throws() should fail if error is not thrown', () => { let threw = false try { assert.throws(() => {}) } catch (err) { assert.equal(err.message, 'should throw error') assert.equal(err.operator, 'throws') threw = true } assert(threw, 'should throw') }) test('.throws() should include custom message in AssertionError', () => { try { assert.throws(() => {}, 'custom message') } catch (err) { assert.equal(err.message, 'custom message') } try { assert.throws(() => {}, new Error(), 'custom message') } catch (err) { assert.equal(err.message, 'custom message') } }) test('.throws() should pass if thrown error matches expected', () => { assert.throws( () => { throw new Error('message') }, new Error('message'), 'simple error message' ) const error1 = new Error('message') error1.actual = { string: 'penguins' } const error2 = new Error('message') error2.actual = { string: 'penguins' } assert.throws( () => { throw error1 }, error2, 'with added actual property' ) }) test('.throws() should compare message of error to expected', () => { const error1 = new Error('message') const error2 = new Error('other message') let threw = false try { assert.throws(() => { throw error1 }, error2) } catch (err) { assert.equal(err.actual, error1) assert.equal(err.expected, error2) threw = true } assert(threw, 'should throw') }) test('.throws() should compare type of error to expected', () => { let threw = false try { assert.throws( () => { throw new Error('message') }, new TypeError('message') ) } catch (err) { threw = true } assert(threw, 'different error types should throw') }) test('.throws() should not compare stack to expectedError', () => { let errorWithDifferentStack function func () { function nested () { errorWithDifferentStack = new Error('message') } nested() } func() assert.throws( () => { throw new Error('message') }, errorWithDifferentStack ) }) // end of assert.throws() tests // --------------------------- // assert.rejects() tests test('.rejects() should resolve if promise rejects', async () => { await assert.rejects(Promise.reject(new Error())) }) test('.rejects() should reject if promise resolves', async () => { let rejected = false try { await assert.rejects(Promise.resolve()) } catch (err) { assert.equal(err.message, 'promise should reject') assert.equal(err.operator, 'rejects') rejected = true } assert(rejected, 'should reject') }) test('.rejects() should include custom message in AssertionError', async () => { try { await assert.rejects(Promise.resolve(), 'custom message') } catch (err) { assert.equal(err.message, 'custom message') } try { await assert.rejects(Promise.resolve(), new Error(), 'custom message') } catch (err) { assert.equal(err.message, 'custom message') } }) test('.rejects() should resolve if error matches expected', async () => { await assert.rejects( Promise.reject(new Error('message')), new Error('message'), 'simple error with message' ) const error1 = new Error('message') error1.actual = { string: 'penguins' } const error2 = new Error('message') error2.actual = { string: 'penguins' } await assert.rejects( Promise.reject(error1), error2, 'with added actual property' ) }) test('.rejects() should compare the message of the rejection error to expected', async () => { const error1 = new Error('message') const error2 = new Error('other message') let rejected = false try { await assert.rejects( Promise.reject(error1), error2 ) } catch (err) { assert.equal(err.actual, error1) assert.equal(err.expected, error2) rejected = true } assert(rejected, 'should reject') }) test('.rejects() should compare type of rejection error to expected', async () => { let rejected = false try { await assert.rejects( Promise.reject(new Error('message')), new TypeError('message') ) } catch (err) { rejected = true } assert(rejected, 'should return rejected promise') }) test('.rejects() should not compare stack to expectedError', async () => { let errorWithDifferentStack function func () { function nested () { errorWithDifferentStack = new Error('message') } nested() } func() await assert.rejects( Promise.reject(new Error('message')), errorWithDifferentStack ) }) // end of assert.rejects() tests