Files
portal/app/tests/Frontend/DealsTable.spec.ts
T
Дмитрий f94552d452 WIP чекпойнт: lead-region/supplier бэкенд + фронт-редизайн + Pint + тесты
92 файла одной пачкой. Исключены чужие зоны: CLAUDE.md, .claude/settings.json, docs/observer/.pii-counters.json.
gitleaks staged: no leaks found. Не верифицировано тестами - сохранение труда в историю.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 05:17:12 +03:00

81 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from 'vitest';
import { mount } from '@vue/test-utils';
import { createVuetify } from 'vuetify';
import DealsTable from '../../resources/js/components/deals/DealsTable.vue';
import type { MockDeal } from '../../resources/js/composables/mockDeals';
const vuetify = createVuetify();
const sampleDeals: MockDeal[] = [
{
id: 1,
name: '+7 (916) 100-00-01',
phone: '+7 (916) 100-00-01',
statusSlug: 'new',
project: 'Окна',
manager: { initials: 'AD', name: 'Admin' },
cost: 0,
receivedMinutesAgo: 5,
signalType: 'call',
city: 'Москва',
comment: 'звонил',
receivedAt: '2026-05-15T09:00:00+00:00',
nextReminderAt: '2026-05-18T07:00:00+00:00',
},
{
id: 2,
name: '+7 (916) 100-00-02',
phone: '+7 (916) 100-00-02',
statusSlug: 'new',
project: 'Двери',
manager: { initials: 'AD', name: 'Admin' },
cost: 0,
receivedMinutesAgo: 30,
signalType: 'site',
city: null,
comment: null,
receivedAt: '2026-05-14T09:00:00+00:00',
nextReminderAt: null,
},
];
describe('DealsTable', () => {
it('рендерит колонки реестра лидов', () => {
const w = mount(DealsTable, {
props: { deals: sampleDeals, selectedIds: [], statusBySlug: new Map() },
global: { plugins: [vuetify] },
});
const headers = w.findAll('thead th').map((h) => h.text());
['Телефон', 'Источник', 'Город', 'Статус', 'Напоминание', 'Комментарий', 'Поставлен'].forEach((label) => {
expect(headers.some((h) => h.includes(label))).toBe(true);
});
});
it('город без значения рендерится как «—»', () => {
const w = mount(DealsTable, {
props: { deals: sampleDeals, selectedIds: [], statusBySlug: new Map() },
global: { plugins: [vuetify] },
});
expect(w.text()).toContain('—');
});
it('select-all чекбокс имеет aria-label', () => {
const w = mount(DealsTable, {
props: { deals: sampleDeals, selectedIds: [], statusBySlug: new Map() },
global: { plugins: [vuetify] },
});
expect(w.find('th .v-selection-control input[type="checkbox"][aria-label="Выбрать все сделки"]').exists()).toBe(
true,
);
});
it('клик по строке эмитит row-click с deal', async () => {
const w = mount(DealsTable, {
props: { deals: sampleDeals, selectedIds: [], statusBySlug: new Map() },
global: { plugins: [vuetify] },
});
await w.find('tbody tr').trigger('click');
expect(w.emitted('row-click')?.[0]?.[0]).toMatchObject({ id: 1 });
});
});