750aa40e8e
Reviewed-on: #355 Co-authored-by: miteruzo <miteruzo@naver.com> Co-committed-by: miteruzo <miteruzo@naver.com>
80 行
2.4 KiB
TypeScript
80 行
2.4 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
|
|
const api = vi.hoisted (() => ({
|
|
isApiError: vi.fn (),
|
|
}))
|
|
|
|
vi.mock ('@/lib/api', () => api)
|
|
|
|
describe ('extractValidationError', () => {
|
|
it ('extracts field and base errors from 422 validation responses', async () => {
|
|
api.isApiError.mockReturnValueOnce (true)
|
|
|
|
const { extractValidationError } = await import ('@/lib/apiErrors')
|
|
const validationError = extractValidationError<'name'> ({
|
|
response: {
|
|
status: 422,
|
|
data: {
|
|
type: 'validation_error',
|
|
message: '入力内容を確認してください.',
|
|
errors: { name: ['名前は必須です.'] },
|
|
base_errors: ['全体エラー'],
|
|
},
|
|
},
|
|
})
|
|
|
|
expect (validationError).toEqual ({
|
|
message: '入力内容を確認してください.',
|
|
fieldErrors: { name: ['名前は必須です.'] },
|
|
baseErrors: ['全体エラー'],
|
|
})
|
|
})
|
|
|
|
it ('preserves dotted field keys for indexed form rows', async () => {
|
|
api.isApiError.mockReturnValueOnce (true)
|
|
|
|
const { extractValidationError } = await import ('@/lib/apiErrors')
|
|
const validationError = extractValidationError<'deerjikists.0.platform'> ({
|
|
response: {
|
|
status: 422,
|
|
data: {
|
|
type: 'validation_error',
|
|
errors: { 'deerjikists.0.platform': ['プラットフォームを入力してください.'] },
|
|
base_errors: [],
|
|
},
|
|
},
|
|
})
|
|
|
|
expect (validationError?.fieldErrors).toEqual ({
|
|
'deerjikists0Platform': ['プラットフォームを入力してください.'],
|
|
})
|
|
})
|
|
|
|
it ('does not treat 400 bad requests as form validation errors', async () => {
|
|
api.isApiError.mockReturnValueOnce (true)
|
|
|
|
const { extractValidationError } = await import ('@/lib/apiErrors')
|
|
const validationError = extractValidationError ({
|
|
response: {
|
|
status: 400,
|
|
data: {
|
|
type: 'bad_request',
|
|
message: 'リクエストが不正です.',
|
|
errors: {},
|
|
base_errors: ['リクエストが不正です.'],
|
|
},
|
|
},
|
|
})
|
|
|
|
expect (validationError).toBeNull ()
|
|
})
|
|
|
|
it ('ignores non-api errors', async () => {
|
|
api.isApiError.mockReturnValueOnce (false)
|
|
|
|
const { extractValidationError } = await import ('@/lib/apiErrors')
|
|
|
|
expect (extractValidationError (new Error ('network'))).toBeNull ()
|
|
})
|
|
})
|