2f6e88e784
Три правки после демо Этапа 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>
53 lines
2.1 KiB
TypeScript
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);
|
|
});
|
|
});
|