bcb327aa13
Инвариант «один проект = один источник»: при переносе проекта на новый источник снимаем привязку со всех прочих источников — проект больше не может висеть в двух конкурентах сразу (жёсткий баг с дублями). Плюс разбор ошибки в автоподборе показывает конкретную причину бэкенда вместо общей фразы «не удалось». Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
59 lines
2.8 KiB
TypeScript
59 lines
2.8 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { AxiosError } from 'axios';
|
|
import { autopodborErrorMessage } from '../../resources/js/api/autopodbor';
|
|
|
|
function axErr(status: number, body: unknown): AxiosError {
|
|
const e = new AxiosError('err');
|
|
// @ts-expect-error — минимальный мок ответа
|
|
e.response = { status, data: body, statusText: '', headers: {}, config: {} };
|
|
return e;
|
|
}
|
|
|
|
describe('autopodborErrorMessage — адресные сообщения по коду ответа', () => {
|
|
it('balance_insufficient → про деньги/пополнение', () => {
|
|
const m = autopodborErrorMessage(axErr(409, { error: 'balance_insufficient' }), 'fallback');
|
|
expect(m.toLowerCase()).toContain('баланс');
|
|
expect(m).not.toBe('fallback');
|
|
});
|
|
|
|
it('run_in_flight → «подбор уже идёт»', () => {
|
|
const m = autopodborErrorMessage(axErr(409, { error: 'run_in_flight' }), 'fallback');
|
|
expect(m.toLowerCase()).toContain('уже идёт');
|
|
});
|
|
|
|
it('name_or_site_required → про название/сайт', () => {
|
|
const m = autopodborErrorMessage(axErr(422, { error: 'name_or_site_required' }), 'fallback');
|
|
expect(m.toLowerCase()).toContain('назван');
|
|
});
|
|
|
|
it('requisites_required → про реквизиты компании', () => {
|
|
const m = autopodborErrorMessage(axErr(422, { error: 'requisites_required' }), 'fallback');
|
|
expect(m.toLowerCase()).toContain('реквизит');
|
|
expect(m).not.toBe('fallback');
|
|
});
|
|
|
|
it('дубль источника (errors.signal_identifier) → показываем причину бэкенда, не fallback', () => {
|
|
const m = autopodborErrorMessage(
|
|
axErr(422, { errors: { signal_identifier: ['У вас уже есть проект с этим источником: «ДСК ✓».'] } }),
|
|
'Не удалось создать проект.',
|
|
);
|
|
expect(m).toContain('уже есть проект с этим источником');
|
|
expect(m).not.toBe('Не удалось создать проект.');
|
|
});
|
|
|
|
it('бэкенд-message без кода → показываем message', () => {
|
|
const m = autopodborErrorMessage(axErr(422, { message: 'Так нельзя.' }), 'fallback');
|
|
expect(m).toBe('Так нельзя.');
|
|
});
|
|
|
|
it('неизвестный код без message/errors → fallback', () => {
|
|
const m = autopodborErrorMessage(axErr(500, { error: 'boom' }), 'мой fallback');
|
|
expect(m).toBe('мой fallback');
|
|
});
|
|
|
|
it('не-axios ошибка → fallback', () => {
|
|
const m = autopodborErrorMessage(new Error('x'), 'мой fallback');
|
|
expect(m).toBe('мой fallback');
|
|
});
|
|
});
|