Files
portal/app/tests/Frontend/SalesProspectsBoardView.spec.ts
T
Дмитрий 2f6e88e784 feat(sales): замечания владельца по воронке — богатая карточка, сортировка созвонов, счётчики фильтра
Три правки после демо Этапа 1 (все по TDD):
1. Карточка показывает ВСЕ данные поиска из payload (тип ProspectPayload 1:1 с
   dataclass Firm; computed infoRows рендерит юрлицо, директора+личный ИНН,
   контакты, бюджет Директа вилкой, каналы/коллтрекинг, оценку). Демо-сидер
   кладёт полный синтетический payload.
2. Начальнику отдаётся manager_counts; фильтр показывает «Имя (N)».
3. Колонка «Переговоры» сортируется по next_call_at ASC (просроченные сверху).

Гейты: бэк 12/12, фронт 19/19, Larastan 0. НЕ выкачено (ждём разрешения владельца).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 17:52:54 +03:00

53 lines
2.1 KiB
TypeScript

import { mount, flushPromises } from '@vue/test-utils';
import { createVuetify } from 'vuetify';
import { describe, expect, it, vi, beforeEach } from 'vitest';
vi.mock('../../resources/js/api/sales', () => ({
listProspects: vi.fn().mockResolvedValue({ prospects: [], by_stage: {}, stages: [] }),
listSalesManagers: vi.fn().mockResolvedValue([
{ id: 7, name: 'Иванов', email: 'i@s', role: 'manager', is_active: true, clients_count: 0, paid_all_time_rub: 0 },
]),
updateProspect: vi.fn(),
extractSalesErrorMessage: () => 'err',
}));
import SalesProspectsBoardView from '../../resources/js/views/sales/SalesProspectsBoardView.vue';
import { listProspects } from '../../resources/js/api/sales';
const vuetify = createVuetify();
interface BoardVm {
managerId: number | null;
load: () => Promise<void>;
managerItems: { id: number | null; name: string }[];
}
describe('SalesProspectsBoardView', () => {
beforeEach(() => vi.clearAllMocks());
it('при выборе менеджера перезагружает с его id', async () => {
const w = mount(SalesProspectsBoardView, { global: { plugins: [vuetify] } });
await flushPromises();
expect(listProspects).toHaveBeenCalledWith(undefined);
(w.vm as unknown as BoardVm).managerId = 7;
await (w.vm as unknown as BoardVm).load();
expect(listProspects).toHaveBeenLastCalledWith(7);
});
it('в фильтре у менеджера показывается число его карточек', async () => {
(listProspects as ReturnType<typeof vi.fn>).mockResolvedValue({
prospects: [],
by_stage: {},
stages: [],
manager_counts: { '7': 3 },
});
const w = mount(SalesProspectsBoardView, { global: { plugins: [vuetify] } });
await flushPromises();
const items = (w.vm as unknown as BoardVm).managerItems;
expect(items[0]).toMatchObject({ id: null, name: 'Все менеджеры' });
expect(items.some((i) => i.name === 'Иванов (3)')).toBe(true);
});
});