From 39286f0fe0900c87a34ea676c34e1024d82d66df Mon Sep 17 00:00:00 2001 From: Kirill Date: Wed, 27 May 2026 21:21:48 +0500 Subject: [PATCH] feat: improve getApiErrorMessage with user-friendly messages --- .../__tests__/get-api-error-message.test.ts | 35 +++++++++++++++++++ .../src/shared/lib/get-api-error-message.ts | 29 +++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 client/src/shared/lib/__tests__/get-api-error-message.test.ts diff --git a/client/src/shared/lib/__tests__/get-api-error-message.test.ts b/client/src/shared/lib/__tests__/get-api-error-message.test.ts new file mode 100644 index 0000000..08e1660 --- /dev/null +++ b/client/src/shared/lib/__tests__/get-api-error-message.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from 'vitest' +import { getApiErrorMessage } from '../get-api-error-message' + +describe('getApiErrorMessage', () => { + it('returns server error message from response.data.error', () => { + const error = { + isAxiosError: true, + response: { data: { error: 'Товар не найден' }, status: 404 }, + } + expect(getApiErrorMessage(error)).toBe('Товар не найден') + }) + + it('returns network error message when no response', () => { + const error = { isAxiosError: true, response: undefined } + expect(getApiErrorMessage(error)).toBe('Нет соединения с сервером. Проверьте подключение к интернету.') + }) + + it('returns server error message for 5xx status', () => { + const error = { isAxiosError: true, response: { data: {}, status: 500 } } + expect(getApiErrorMessage(error)).toBe('Произошла ошибка. Попробуйте повторить позже.') + }) + + it('returns error message for Error instance', () => { + expect(getApiErrorMessage(new Error('Something broke'))).toBe('Something broke') + }) + + it('returns unknown error for falsy input', () => { + expect(getApiErrorMessage(null)).toBe('Произошла неизвестная ошибка') + expect(getApiErrorMessage(undefined)).toBe('Произошла неизвестная ошибка') + }) + + it('returns unknown error for random object', () => { + expect(getApiErrorMessage({ foo: 'bar' })).toBe('Произошла неизвестная ошибка') + }) +}) diff --git a/client/src/shared/lib/get-api-error-message.ts b/client/src/shared/lib/get-api-error-message.ts index c68f6a0..519ab32 100644 --- a/client/src/shared/lib/get-api-error-message.ts +++ b/client/src/shared/lib/get-api-error-message.ts @@ -1,8 +1,23 @@ -export function getApiErrorMessage(err: unknown): string | null { - if (!err || typeof err !== 'object') return null - const anyErr = err as Record - const response = anyErr.response as Record | undefined - const data = response?.data as Record | undefined - const msg = data?.error - return typeof msg === 'string' ? msg : null +import { isAxiosError } from 'axios' + +export function getApiErrorMessage(error: unknown): string { + if (!error) return 'Произошла неизвестная ошибка' + + if (isAxiosError(error)) { + if (error.response?.data?.error && typeof error.response.data.error === 'string') { + return error.response.data.error + } + if (!error.response) { + return 'Нет соединения с сервером. Проверьте подключение к интернету.' + } + if (error.response.status >= 500) { + return 'Произошла ошибка. Попробуйте повторить позже.' + } + } + + if (error instanceof Error) { + return error.message + } + + return 'Произошла неизвестная ошибка' }