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()), 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; }); 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; }; vm.addComp.name = 'Сиб Дент'; await vm.saveAdd(); expect(vm.addComp.note).toContain('слишком длинная'); expect(vm.addComp.note).not.toBe('Не удалось добавить конкурента.'); }); });