feat: allow contact cards for organizations #701
This commit is contained in:
@@ -102,4 +102,98 @@ describe('ContactForm', () => {
|
||||
expect.arrayContaining([expect.objectContaining({ kind: 'given', value: 'Jane' })])
|
||||
);
|
||||
});
|
||||
|
||||
it('saves an organization-only card when the organization type is selected', async () => {
|
||||
const onSave = vi.fn().mockResolvedValue(undefined);
|
||||
render(<ContactForm onSave={onSave} onCancel={vi.fn()} />);
|
||||
|
||||
fireEvent.click(screen.getByText('type_organization'));
|
||||
fireEvent.change(screen.getByPlaceholderText('organization_placeholder'), { target: { value: 'Acme Corp' } });
|
||||
fireEvent.submit(screen.getByText('save').closest('form')!);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(onSave).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
const savedData = onSave.mock.calls[0][0];
|
||||
expect(savedData.kind).toBe('org');
|
||||
expect(savedData.organizations.o0.name).toBe('Acme Corp');
|
||||
// No personal name components; the org name carries the display name instead.
|
||||
expect(savedData.name.components).toBeUndefined();
|
||||
expect(savedData.name.full).toBe('Acme Corp');
|
||||
});
|
||||
|
||||
it('hides the personal name fields in organization mode', () => {
|
||||
render(<ContactForm onSave={vi.fn()} onCancel={vi.fn()} />);
|
||||
expect(screen.getByPlaceholderText('given_name')).toBeInTheDocument();
|
||||
|
||||
fireEvent.click(screen.getByText('type_organization'));
|
||||
|
||||
expect(screen.queryByPlaceholderText('given_name')).not.toBeInTheDocument();
|
||||
expect(screen.queryByPlaceholderText('surname')).not.toBeInTheDocument();
|
||||
// The organization field moves into the identity section, so it appears once.
|
||||
expect(screen.getAllByPlaceholderText('organization_placeholder')).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('still requires a name in organization mode', async () => {
|
||||
const onSave = vi.fn();
|
||||
render(<ContactForm onSave={onSave} onCancel={vi.fn()} />);
|
||||
|
||||
fireEvent.click(screen.getByText('type_organization'));
|
||||
fireEvent.submit(screen.getByText('save').closest('form')!);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText('name_required')).toBeInTheDocument();
|
||||
});
|
||||
expect(onSave).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('accepts an organization instead of a personal name in person mode', async () => {
|
||||
const onSave = vi.fn().mockResolvedValue(undefined);
|
||||
render(<ContactForm onSave={onSave} onCancel={vi.fn()} />);
|
||||
|
||||
fireEvent.click(screen.getByText('section_work'));
|
||||
fireEvent.change(screen.getByPlaceholderText('organization_placeholder'), { target: { value: 'Acme Corp' } });
|
||||
fireEvent.submit(screen.getByText('save').closest('form')!);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(onSave).toHaveBeenCalledOnce();
|
||||
});
|
||||
expect(onSave.mock.calls[0][0].name.full).toBe('Acme Corp');
|
||||
});
|
||||
|
||||
it('opens an existing org card in organization mode', () => {
|
||||
const orgContact: ContactCard = {
|
||||
id: '2',
|
||||
addressBookIds: {},
|
||||
kind: 'org',
|
||||
name: { full: 'Acme Corp' },
|
||||
organizations: { o0: { name: 'Acme Corp' } },
|
||||
};
|
||||
render(<ContactForm contact={orgContact} onSave={vi.fn()} onCancel={vi.fn()} />);
|
||||
|
||||
expect(screen.queryByPlaceholderText('given_name')).not.toBeInTheDocument();
|
||||
expect(screen.getByDisplayValue('Acme Corp')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('switches an org card back to a person', async () => {
|
||||
const onSave = vi.fn().mockResolvedValue(undefined);
|
||||
const orgContact: ContactCard = {
|
||||
id: '2',
|
||||
addressBookIds: {},
|
||||
kind: 'org',
|
||||
name: { full: 'Acme Corp' },
|
||||
organizations: { o0: { name: 'Acme Corp' } },
|
||||
};
|
||||
render(<ContactForm contact={orgContact} onSave={onSave} onCancel={vi.fn()} />);
|
||||
|
||||
fireEvent.click(screen.getByText('type_person'));
|
||||
fireEvent.change(screen.getByPlaceholderText('given_name'), { target: { value: 'Jane' } });
|
||||
fireEvent.submit(screen.getByText('save').closest('form')!);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(onSave).toHaveBeenCalledOnce();
|
||||
});
|
||||
expect(onSave.mock.calls[0][0].kind).toBe('individual');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user