Files
portal/app/tests/Frontend/ProspectContactsEditor.spec.ts
T

83 lines
3.3 KiB
TypeScript
Raw Normal View History

2026-07-18 12:29:04 +03:00
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'] }]);
});
});