134 lines
4.3 KiB
TypeScript
134 lines
4.3 KiB
TypeScript
import { assert, test, describe } from 'vitest'
|
|
import { handleApiError } from '../../src/api'
|
|
import {
|
|
AuthenticationError,
|
|
RateLimitError,
|
|
SandboxError,
|
|
} from '../../src/errors'
|
|
|
|
function createMockResponse(
|
|
status: number,
|
|
error: unknown,
|
|
data?: unknown
|
|
): {
|
|
response: { status: number; ok: boolean }
|
|
error: unknown
|
|
data: unknown
|
|
} {
|
|
return {
|
|
response: { status, ok: status >= 200 && status < 300 },
|
|
error,
|
|
data,
|
|
}
|
|
}
|
|
|
|
describe('handleApiError', () => {
|
|
describe('without content', () => {
|
|
// openapi-fetch leaves `error` undefined for non-2xx responses with
|
|
// Content-Length: 0
|
|
test('catches 404 with undefined error', () => {
|
|
const res = createMockResponse(404, undefined)
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, '404')
|
|
})
|
|
|
|
test('catches 500 with undefined error', () => {
|
|
const res = createMockResponse(500, undefined)
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, '500')
|
|
})
|
|
|
|
test('returns AuthenticationError for 401 with undefined error', () => {
|
|
const res = createMockResponse(401, undefined)
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, AuthenticationError)
|
|
assert.include(err?.message, 'Unauthorized')
|
|
})
|
|
})
|
|
|
|
describe('with empty error body', () => {
|
|
test('catches 404 with empty string error', () => {
|
|
const res = createMockResponse(404, '')
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, '404')
|
|
})
|
|
|
|
test('catches 400 with empty string error', () => {
|
|
const res = createMockResponse(400, '')
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, '400')
|
|
})
|
|
|
|
test('catches 500 with empty string error', () => {
|
|
const res = createMockResponse(500, '')
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, '500')
|
|
})
|
|
})
|
|
|
|
describe('with JSON error body', () => {
|
|
test('catches 404 with message', () => {
|
|
const res = createMockResponse(404, { code: 404, message: 'Not found' })
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, 'Not found')
|
|
})
|
|
|
|
test('catches 400 with message', () => {
|
|
const res = createMockResponse(400, { code: 400, message: 'Bad request' })
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, SandboxError)
|
|
assert.include(err?.message, 'Bad request')
|
|
})
|
|
})
|
|
|
|
describe('special status codes', () => {
|
|
test('returns AuthenticationError for 401', () => {
|
|
const res = createMockResponse(401, { message: 'Invalid token' })
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, AuthenticationError)
|
|
assert.include(err?.message, 'Unauthorized')
|
|
})
|
|
|
|
test('returns AuthenticationError for 401 with empty body', () => {
|
|
const res = createMockResponse(401, '')
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, AuthenticationError)
|
|
assert.include(err?.message, 'Unauthorized')
|
|
})
|
|
|
|
test('returns RateLimitError for 429', () => {
|
|
const res = createMockResponse(429, { message: 'Too many requests' })
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, RateLimitError)
|
|
assert.include(err?.message, 'Rate limit')
|
|
})
|
|
|
|
test('returns RateLimitError for 429 with empty body', () => {
|
|
const res = createMockResponse(429, '')
|
|
const err = handleApiError(res as any)
|
|
assert.instanceOf(err, RateLimitError)
|
|
assert.include(err?.message, 'Rate limit')
|
|
})
|
|
})
|
|
|
|
describe('success responses', () => {
|
|
test('returns undefined for 200 success', () => {
|
|
const res = createMockResponse(200, undefined, { id: '123' })
|
|
const err = handleApiError(res as any)
|
|
assert.isUndefined(err)
|
|
})
|
|
|
|
test('returns undefined for 201 success', () => {
|
|
const res = createMockResponse(201, undefined, { id: '123' })
|
|
const err = handleApiError(res as any)
|
|
assert.isUndefined(err)
|
|
})
|
|
})
|
|
})
|