import { mount } from '@vue/test-utils'; import { createVuetify } from 'vuetify'; import { describe, expect, it } from 'vitest'; import ProspectContactsEditor from '../../resources/js/components/sales/ProspectContactsEditor.vue'; import { cleanContacts, toForm, type ContactForm } from '../../resources/js/utils/prospectContacts'; const vuetify = createVuetify(); interface EditorVm { rows: ContactForm[]; addContact: () => void; removeContact: (i: number) => void; addPhone: (i: number) => void; removePhone: (i: number, j: number) => void; } function factory(modelValue: ContactForm[] = [{ name: '', position: '', phones: [''] }]) { const w = mount(ProspectContactsEditor, { props: { modelValue }, global: { plugins: [vuetify] } }); return { w, vm: w.vm as unknown as EditorVm }; } describe('ProspectContactsEditor', () => { it('добавляет и убирает людей', () => { const { vm } = factory(); expect(vm.rows).toHaveLength(1); vm.addContact(); expect(vm.rows).toHaveLength(2); vm.removeContact(1); expect(vm.rows).toHaveLength(1); }); it('последнего человека убрать нельзя — остаётся пустая строка', () => { const { vm } = factory(); vm.removeContact(0); expect(vm.rows).toHaveLength(1); expect(vm.rows[0].name).toBe(''); }); it('добавляет и убирает телефоны, последний остаётся пустой строкой', () => { const { vm } = factory(); vm.addPhone(0); expect(vm.rows[0].phones).toHaveLength(2); vm.removePhone(0, 1); expect(vm.rows[0].phones).toHaveLength(1); vm.removePhone(0, 0); expect(vm.rows[0].phones).toEqual(['']); }); it('изменения уходят наверх через update:modelValue', () => { const { w, vm } = factory(); vm.addContact(); expect(w.emitted('update:modelValue')).toBeTruthy(); }); }); describe('утилиты контактов', () => { it('toForm: пустой список → одна пустая строка', () => { expect(toForm([])).toEqual([{ name: '', position: '', phones: [''] }]); expect(toForm(null)).toHaveLength(1); }); it('toForm: сохранённые контакты разворачиваются в форму', () => { const rows = toForm([{ name: 'Захаров', position: 'директор', phones: ['+79136518088'] }]); expect(rows[0]).toEqual({ name: 'Захаров', position: 'директор', phones: ['+79136518088'] }); }); it('toForm: контакт без телефонов получает пустую заготовку', () => { expect(toForm([{ name: 'Без телефона', position: null, phones: [] }])[0].phones).toEqual(['']); }); it('cleanContacts: мусор выброшен, должность пустая → null', () => { const out = cleanContacts([ { name: ' ', position: '', phones: ['', ' '] }, { name: 'Сидоров', position: ' ', phones: ['+79130000009', ''] }, ]); expect(out).toEqual([{ name: 'Сидоров', position: null, phones: ['+79130000009'] }]); }); });