Files
portal/app/tests/Frontend/AutopodborManualCompetitorError.spec.ts
T
Дмитрий 1aca591558 fix(тесты экранов): в главную перенесён запрет на выход в сеть
Перенос ГОТОВОЙ работы соседей: запись c5ca3c438 из ветки
feat/prospects-manual-testing-kp (02.08.2026). Своего такого же не писал — это
задвоило бы правило и устроило столкновение при сведении их ветки.

Зачем. В главной тесты экранов физически ходили в интернет, оставаясь ЗЕЛЁНЫМИ:
ошибка вылетала мимо проверок. Видна была только одна течь — AxiosError на
/api/autopodbor/proposals в общем прогоне; их 93 в 14 файлах.

Сторож делает две вещи, и обе нужны:
  1) обрывает запрос — наружу физически ничего не уходит;
  2) ЗАПОМИНАЕТ адрес и роняет тест в afterEach — иначе код под тестом глотает
     ошибку своим catch, и нарушение снова становится невидимым.

Приёмка ВЫРЕЗАНИЕМ, а не по зелёному: подложен тест, который нарочно лезет в сеть
и глотает ошибку. Сторож покраснел и назвал адрес — то есть вторая половина
работает. Подложка удалена.

Взято не всё: их промт-документ 2026-08-02-PROMT-podgotovka-k-produ-8.md в главную
НЕ переносился. Вспомогательный tests/Frontend/support/fixtures.ts взят — без него
четыре их правленых теста не собираются.

Проверено: 242 файла, 1947 тестов зелёные, 3 пропущены, строки «Errors» больше нет
(была 1). Серверный прогон не затронут.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 09:20:24 +03:00

71 lines
3.6 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { mount } from '@vue/test-utils';
import { createPinia, setActivePinia } from 'pinia';
import { createVuetify } from 'vuetify';
import { reactive, ref } from 'vue';
// Мокаем только сетевые вызовы; autopodborErrorMessage (разбор причины) — настоящая,
// именно её работу мы и проверяем.
vi.mock('../../resources/js/api/autopodbor', async (importOriginal) => ({
...(await importOriginal<typeof import('../../resources/js/api/autopodbor')>()),
startStudyBatch: vi.fn(),
}));
import FieldWorkspaceScreen from '../../resources/js/views/autopodbor/screens/FieldWorkspaceScreen.vue';
import { useAutopodborStore } from '../../resources/js/stores/autopodborStore';
/**
* Инцидент 14.07.2026: клиент трижды нажал «Добавить в поле» и трижды увидел одинаковое
* «Не удалось добавить конкурента» — форма ловила ошибку голым catch {} и выбрасывала
* объяснение сервера в мусор. Человек не понял, что чинить, и бросил функцию совсем.
*
* Теперь форма обязана показать ПРИЧИНУ, присланную сервером.
*/
const vuetify = createVuetify();
function makeNav() {
return { go: vi.fn(), ctx: reactive({ competitorId: null }), screen: ref('field') };
}
function mountWs(nav: unknown) {
return mount(FieldWorkspaceScreen, { global: { plugins: [vuetify], provide: { autopodborNav: nav } } });
}
describe('FieldWorkspaceScreen — «Добавить вручную» объясняет отказ', () => {
beforeEach(() => {
setActivePinia(createPinia());
vi.clearAllMocks();
});
it('показывает причину от сервера, а не безликое «Не удалось»', async () => {
const store = useAutopodborStore();
vi.spyOn(store, 'loadField').mockImplementation(async () => {
store.field = [] as never;
});
// Экран при открытии тянет ДВА списка сразу (см. reload() в FieldWorkspaceScreen).
// Без этой заглушки тест физически слал запрос наружу на /api/autopodbor/proposals
// и всё равно был зелёным — ошибка вылетала мимо проверок. Ловит сторож сети
// в tests/Frontend/setup.ts.
vi.spyOn(store, 'loadProposalGroups').mockResolvedValue(undefined);
vi.spyOn(store, 'addFieldCompetitor').mockRejectedValue({
isAxiosError: true, // как настоящая ошибка axios
response: {
status: 422,
data: { errors: { 'elements.0.cards.0': ['Ссылка на карточку слишком длинная — максимум 2000 символов.'] } },
},
});
const w = mountWs(makeNav());
await new Promise((r) => setTimeout(r, 0));
const vm = w.vm as unknown as {
addComp: { open: boolean; name: string; note: string; elements: unknown[] };
saveAdd: () => Promise<void>;
};
vm.addComp.name = 'Сиб Дент';
await vm.saveAdd();
expect(vm.addComp.note).toContain('слишком длинная');
expect(vm.addComp.note).not.toBe('Не удалось добавить конкурента.');
});
});