83 lines
3.3 KiB
TypeScript
83 lines
3.3 KiB
TypeScript
|
|
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'] }]);
|
||
|
|
});
|
||
|
|
});
|