Remove unused resolveAxiosErrorMessage helper.

Upload UI uses predefined queue messages only; surfacing API response text is out of scope for this PR.
This commit is contained in:
2026-10-25 22:23:01 +01:00
parent 42fe209164
commit ee9f80da5f
2 changed files with 0 additions and 122 deletions
@@ -1,82 +0,0 @@
import { AxiosError, type InternalAxiosRequestConfig } from 'axios';
import { describe, expect, it } from 'vitest';
import { resolveAxiosErrorMessage } from '@/utils/http/resolveAxiosErrorMessage';
const fallback = 'Upload failed';
const axiosErrorWithResponse = (data: unknown, message = 'Request failed'): AxiosError => {
return new AxiosError(
message,
AxiosError.ERR_BAD_REQUEST,
{} as InternalAxiosRequestConfig,
{},
{
status: 400,
statusText: 'Bad Request',
headers: {},
config: {} as InternalAxiosRequestConfig,
data
}
);
};
describe('resolveAxiosErrorMessage', () => {
it('falls back for non-Axios errors', () => {
expect(resolveAxiosErrorMessage(new Error('network'), fallback)).toBe('network');
expect(resolveAxiosErrorMessage('oops', fallback)).toBe(fallback);
});
it('falls back when Axios error has no response', () => {
const error = new AxiosError('timeout', AxiosError.ETIMEDOUT);
expect(resolveAxiosErrorMessage(error, fallback)).toBe('timeout');
});
it('uses string response data', () => {
const error = axiosErrorWithResponse('Rate limit exceeded');
expect(resolveAxiosErrorMessage(error, fallback)).toBe('Rate limit exceeded');
});
it('uses object message string (Nest-style)', () => {
const error = axiosErrorWithResponse({ message: 'Invalid ciphertext' });
expect(resolveAxiosErrorMessage(error, fallback)).toBe('Invalid ciphertext');
});
it('uses a single string from message array', () => {
const error = axiosErrorWithResponse({ message: ['iv must be valid base64'] });
expect(resolveAxiosErrorMessage(error, fallback)).toBe('iv must be valid base64');
});
it('joins multiple strings in message array', () => {
const error = axiosErrorWithResponse({
message: ['expiresAt must be a date', 'maxViews must be a number']
});
expect(resolveAxiosErrorMessage(error, fallback)).toBe(
'expiresAt must be a date, maxViews must be a number'
);
});
it('ignores non-string entries in message array', () => {
const error = axiosErrorWithResponse({
message: ['valid', 42, null, 'also valid']
});
expect(resolveAxiosErrorMessage(error, fallback)).toBe('valid, also valid');
});
it('falls back when response data has no usable message', () => {
const error = axiosErrorWithResponse({ message: [] }, 'HTTP 400');
expect(resolveAxiosErrorMessage(error, fallback)).toBe('HTTP 400');
});
it('falls back when response data is an object without message', () => {
const error = axiosErrorWithResponse({ statusCode: 400 }, 'HTTP 400');
expect(resolveAxiosErrorMessage(error, fallback)).toBe('HTTP 400');
});
});
@@ -1,40 +0,0 @@
import { isAxiosError } from 'axios';
import { resolveErrorMessage } from '@/utils/resolveErrorMessage';
const getAxiosErrorResponseMessage = (data: unknown): string | null => {
if (typeof data === 'string') {
return data;
}
if (typeof data !== 'object' || data === null || !('message' in data)) {
return null;
}
const { message } = data;
if (typeof message === 'string') {
return message;
}
if (Array.isArray(message)) {
const texts = message.filter((item): item is string => typeof item === 'string');
if (texts.length === 1) {
return texts[0];
}
if (texts.length > 1) {
return texts.join(', ');
}
}
return null;
};
export const resolveAxiosErrorMessage = (error: unknown, fallback: string): string => {
if (!isAxiosError(error) || !error.response) {
return resolveErrorMessage(error, fallback);
}
return getAxiosErrorResponseMessage(error.response.data) ?? resolveErrorMessage(error, fallback);
};