Skip to content

Commit 8cf1725

Browse files
committed
tests(pkg): improve utils/errorHandler tests
1 parent c0f4c6f commit 8cf1725

2 files changed

Lines changed: 173 additions & 87 deletions

File tree

Lines changed: 172 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,208 @@
1-
import { describe, it, expect } from 'vitest'
1+
import { describe, test, expect } from 'vitest'
22
import { handleError, isError, rejectWithError } from '../errorHandler'
33

44
const defaultErrorMessage = 'an unknown error occurred.'
55

66
describe('errorHandler.ts - exports', () => {
7-
it('isError function', () => {
7+
test('isError function', () => {
88
expect(isError).toBeDefined()
99
expect(isError).toBeInstanceOf(Function)
1010
})
1111

12-
it('handleError function', () => {
12+
test('handleError function', () => {
1313
expect(handleError).toBeDefined()
1414
expect(handleError).toBeInstanceOf(Function)
1515
})
1616

17-
it('rejectWithError function', () => {
17+
test('rejectWithError function', () => {
1818
expect(rejectWithError).toBeDefined()
1919
expect(rejectWithError).toBeInstanceOf(Function)
2020
})
2121
})
2222

23-
describe('isError', () => {
24-
it('returns true for errors', () => {
25-
expect(isError(Error())).toBe(true)
26-
expect(isError(TypeError())).toBe(true)
27-
expect(isError(SyntaxError())).toBe(true)
28-
expect(isError(EvalError())).toBe(true)
29-
expect(isError(RangeError())).toBe(true)
30-
expect(isError(ReferenceError())).toBe(true)
31-
expect(isError(URIError())).toBe(true)
23+
describe('isError()', () => {
24+
describe('returns true for Error types:', () => {
25+
test.each([
26+
['Error', Error()],
27+
['TypeError', TypeError()],
28+
['SyntaxError', SyntaxError()],
29+
['EvalError', EvalError()],
30+
['RangeError', RangeError()],
31+
['ReferenceError', ReferenceError()],
32+
['URIError', URIError()],
33+
])('%s', (_, error) => {
34+
expect(isError(error)).toBe(true)
35+
})
3236
})
3337

34-
it('returns false for non-errors', () => {
35-
expect(isError(123)).toBe(false)
36-
expect(isError('string')).toBe(false)
37-
expect(isError({ message: 'test' })).toBe(false)
38-
expect(isError([1, 2, 3])).toBe(false)
39-
expect(isError(null)).toBe(false)
40-
expect(isError(undefined)).toBe(false)
41-
expect(isError(true)).toBe(false)
42-
expect(isError(false)).toBe(false)
43-
expect(isError(() => null)).toBe(false)
38+
describe('returns false for non-Error types:', () => {
39+
test.each([
40+
['string', 'string'],
41+
['number', 123],
42+
['object', { message: 'test' }],
43+
['array', [1, 2, 3]],
44+
['null', null],
45+
['undefined', undefined],
46+
['true', true],
47+
['false', false],
48+
['function', () => null],
49+
['Map', new Map()],
50+
['Date', new Date()],
51+
['RegExp', new RegExp('test')],
52+
['Promise', Promise.resolve()],
53+
])('%s', (_, error) => {
54+
expect(isError(error)).toBe(false)
55+
// @ts-expect-error Expected 1 arguments, but got 0.
56+
expect(isError()).toBe(false)
57+
})
4458
})
4559
})
4660

47-
describe('handleError', () => {
48-
it('returns same Error when provided an Error', () => {
49-
expect(handleError(Error('test error'))).toBeInstanceOf(Error)
50-
expect(handleError(Error('test error')).message).toBe('test error')
51-
52-
expect(handleError(TypeError('test error'))).toBeInstanceOf(TypeError)
53-
expect(handleError(SyntaxError('test error'))).toBeInstanceOf(SyntaxError)
54-
expect(handleError(EvalError('test error'))).toBeInstanceOf(EvalError)
55-
expect(handleError(RangeError('test error'))).toBeInstanceOf(RangeError)
56-
expect(handleError(ReferenceError('test error'))).toBeInstanceOf(
57-
ReferenceError
58-
)
59-
expect(handleError(URIError('test error'))).toBeInstanceOf(URIError)
61+
describe('handleError()', () => {
62+
describe('returns same Error and default message when passed an Error type without a message:', () => {
63+
test.each([
64+
['Error', Error()],
65+
['TypeError', TypeError()],
66+
['SyntaxError', SyntaxError()],
67+
['EvalError', EvalError()],
68+
['RangeError', RangeError()],
69+
['ReferenceError', ReferenceError()],
70+
['URIError', URIError()],
71+
])('%s', (_, error) => {
72+
expect(handleError(error)).toBeInstanceOf(Error)
73+
})
6074
})
6175

62-
it('returns an Error with message when provided a message string', () => {
63-
expect(handleError('test error')).toBeInstanceOf(Error)
64-
expect(handleError('test error').message).toBe('test error')
65-
66-
expect(handleError('')).toBeInstanceOf(Error)
67-
expect(handleError('').message).toBe('')
76+
describe('returns same Error and message when passed an Error type containing a message:', () => {
77+
const errorMsg = 'some test error message'
78+
test.each([
79+
['Error', Error(errorMsg)],
80+
['TypeError', TypeError(errorMsg)],
81+
['SyntaxError', SyntaxError(errorMsg)],
82+
['EvalError', EvalError(errorMsg)],
83+
['RangeError', RangeError(errorMsg)],
84+
['ReferenceError', ReferenceError(errorMsg)],
85+
['URIError', URIError(errorMsg)],
86+
])('%s', (_, error) => {
87+
expect(handleError(error)).toBeInstanceOf(Error)
88+
expect(handleError(error).message).toBe(errorMsg)
89+
})
6890
})
6991

70-
it('returns an Error with default message', () => {
71-
expect(handleError(Error())).toBeInstanceOf(Error)
72-
expect(handleError(Error()).message).toBe(defaultErrorMessage)
73-
74-
expect(handleError(undefined)).toBeInstanceOf(Error)
75-
expect(handleError(undefined).message).toBe(defaultErrorMessage)
92+
describe('returns a new Error with same message when passed a message string:', () => {
93+
test.each([
94+
['string', 'some error message'],
95+
['empty string', ''],
96+
])('%s', (_, errorMsg) => {
97+
expect(handleError(errorMsg)).toBeInstanceOf(Error)
98+
expect(handleError(errorMsg).message).toBe(errorMsg)
99+
})
100+
})
76101

77-
expect(handleError(null)).toBeInstanceOf(Error)
78-
expect(handleError(null).message).toBe(defaultErrorMessage)
102+
describe('returns an Error with a default message if not passed a string or Error:', () => {
103+
test.each([
104+
['number', 123],
105+
['object', { message: 'test' }],
106+
['array', [1, 2, 3]],
107+
['null', null],
108+
['undefined', undefined],
109+
['true', true],
110+
['false', false],
111+
['function', () => null],
112+
['Map', new Map()],
113+
['Date', new Date()],
114+
['RegExp', new RegExp('test')],
115+
['Promise', Promise.resolve()],
116+
])('%s', (_, error) => {
117+
expect(handleError(error)).toBeInstanceOf(Error)
118+
expect(handleError(error).message).toBe(defaultErrorMessage)
119+
120+
// @ts-expect-error Expected 1 arguments, but got 0.
121+
expect(handleError()).toBeInstanceOf(Error)
122+
// @ts-expect-error Expected 1 arguments, but got 0.
123+
expect(handleError().message).toBe(defaultErrorMessage)
124+
})
125+
})
126+
})
79127

80-
expect(handleError({ message: 'test error', b: 2 })).toBeInstanceOf(Error)
81-
expect(handleError({ message: 'test error', b: 2 }).message).toBe(
82-
defaultErrorMessage
83-
)
128+
describe('rejectWithError() - returns rejected promise:', () => {
129+
describe('with same Error and default message when passed an Error type without a message', () => {
130+
test.each([
131+
['Error', Error()],
132+
['TypeError', TypeError()],
133+
['SyntaxError', SyntaxError()],
134+
['EvalError', EvalError()],
135+
['RangeError', RangeError()],
136+
['ReferenceError', ReferenceError()],
137+
['URIError', URIError()],
138+
])('%s', async (_, error) => {
139+
await expect(rejectWithError(error)).rejects.toBeInstanceOf(Error)
140+
await expect(rejectWithError(error)).rejects.toHaveProperty(
141+
'message',
142+
defaultErrorMessage
143+
)
144+
})
145+
})
84146

85-
expect(handleError(['a', 'b', 'c'])).toBeInstanceOf(Error)
86-
expect(handleError(['a', 'b', 'c']).message).toBe(defaultErrorMessage)
147+
describe('with same Error and message when when passed an Error type with a message', () => {
148+
test.each([
149+
['Error', Error('test error')],
150+
['TypeError', TypeError('test error')],
151+
['SyntaxError', SyntaxError('test error')],
152+
['EvalError', EvalError('test error')],
153+
['RangeError', RangeError('test error')],
154+
['ReferenceError', ReferenceError('test error')],
155+
['URIError', URIError('test error')],
156+
])('%s', async (_, error) => {
157+
await expect(rejectWithError(error)).rejects.toBeInstanceOf(Error)
158+
await expect(rejectWithError(error)).rejects.toHaveProperty(
159+
'message',
160+
'test error'
161+
)
162+
})
87163
})
88-
})
89164

90-
describe('rejectWithError', () => {
91-
it('rejects with provided Error', async () => {
92-
await expect(rejectWithError(Error('test error'))).rejects.toBeInstanceOf(
93-
Error
94-
)
95-
await expect(rejectWithError(Error('test error'))).rejects.toHaveProperty(
96-
'message',
97-
'test error'
98-
)
165+
describe('with new Error when a passed a string as the error message', () => {
166+
test.each([
167+
['string', 'test error'],
168+
['empty string', ''],
169+
])('%s', async (_, errorMsg) => {
170+
await expect(rejectWithError(errorMsg)).rejects.toBeInstanceOf(Error)
171+
await expect(rejectWithError(errorMsg)).rejects.toHaveProperty(
172+
'message',
173+
errorMsg
174+
)
175+
})
99176
})
100177

101-
it('rejects with a new Error if not provided an Error', async () => {
102-
await expect(rejectWithError('test error')).rejects.toBeInstanceOf(Error)
103-
await expect(rejectWithError('test error')).rejects.toHaveProperty(
104-
'message',
105-
'test error'
106-
)
107-
108-
await expect(rejectWithError('')).rejects.toBeInstanceOf(Error)
109-
await expect(rejectWithError('')).rejects.toHaveProperty('message', '')
110-
111-
await expect(rejectWithError(Error())).rejects.toBeInstanceOf(Error)
112-
await expect(rejectWithError(Error())).rejects.toHaveProperty(
113-
'message',
114-
defaultErrorMessage
115-
)
116-
117-
await expect(rejectWithError(undefined)).rejects.toBeInstanceOf(Error)
118-
await expect(rejectWithError(undefined)).rejects.toHaveProperty(
119-
'message',
120-
defaultErrorMessage
121-
)
178+
describe('with a new Error and default message if not passed an Error or string', () => {
179+
test.each([
180+
['number', 123],
181+
['object', { message: 'test' }],
182+
['array', [1, 2, 3]],
183+
['null', null],
184+
['undefined', undefined],
185+
['true', true],
186+
['false', false],
187+
['function', () => null],
188+
['Map', new Map()],
189+
['Date', new Date()],
190+
['RegExp', new RegExp('test')],
191+
['Promise', Promise.resolve()],
192+
])('%s', async (_, error) => {
193+
await expect(rejectWithError(error)).rejects.toBeInstanceOf(Error)
194+
await expect(rejectWithError(error)).rejects.toHaveProperty(
195+
'message',
196+
defaultErrorMessage
197+
)
198+
199+
// @ts-expect-error Expected 1 arguments, but got 0.
200+
await expect(rejectWithError()).rejects.toBeInstanceOf(Error)
201+
// @ts-expect-error Expected 1 arguments, but got 0.
202+
await expect(rejectWithError()).rejects.toHaveProperty(
203+
'message',
204+
defaultErrorMessage
205+
)
206+
})
122207
})
123208
})

packages/lib/src/utils/errorHandler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const isError = (error: unknown): boolean => {
1717

1818
/**
1919
* Handles errors by returning an Error instance.
20+
*
2021
* Accepts any type of value but will return default error message of `an unknown error occurred` if
2122
* `error` is not an Error type or a message string.
2223
*

0 commit comments

Comments
 (0)