adriengibrat/ts-custom-error

View on GitHub
src/custom-error.spec.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { checkProtoChain, checkProperties } from './spec.utils'
import { CustomError } from './custom-error'

test('Instance', () => checkProtoChain(CustomError, Error))

test('Instance pre ES6 environment', () => {
    const O = Object as any
    const E = Error as any
    const setPrototypeOf = O.setPrototypeOf
    const captureStackTrace = E.captureStackTrace
    delete O.setPrototypeOf
    delete E.captureStackTrace

    checkProtoChain(CustomError, Error)
    checkProperties(new CustomError(), {
        name: 'CustomError',
        message: '',
    })
    O.setPrototypeOf = setPrototypeOf
    E.captureStackTrace = captureStackTrace
})

test('Extended', () => {
    class SubError extends CustomError { }
    checkProtoChain(SubError, CustomError, Error)
    checkProperties(new SubError('test message'), {
        name: 'SubError',
        message: 'test message',
    })
})

test('Extended with constructor', () => {
    class HttpError extends CustomError {
        constructor(public code: number, message?: string) {
            super(message)
        }
    }
    checkProtoChain(HttpError, CustomError, Error)
    checkProperties(new HttpError(404, 'test message'), {
        name: 'HttpError',
        code: 404,
        message: 'test message',
    })
})

test('Extended with name', () => {
    class RenamedError extends CustomError {
        constructor(name: string, message?: string) {
            super(message)
            Object.defineProperty(this, 'name', { value: name });
        }
    }
    checkProtoChain(RenamedError, CustomError, Error)
    checkProperties(new RenamedError('test', 'test message'), {
        name: 'test',
        message: 'test message',
    })
})

test('Basic properties', () =>
    checkProperties(new CustomError('my message'), {
        name: 'CustomError',
        message: 'my message',
    }))

test('Without message', () =>
    checkProperties(new CustomError(), {
        name: 'CustomError',
        message: '',
    }))

test('Native log behaviour', () =>
    expect(`${new CustomError('Hello')}`).toMatch('CustomError: Hello'))

test('Error cause', () => {
    const cause = new Error()
    checkProperties(new CustomError('test message', { cause }), {
        name: 'CustomError',
        message: 'test message',
        cause,
    })
})