mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-10-29 10:18:29 -04:00
92 lines
2.9 KiB
React
92 lines
2.9 KiB
React
import {render, screen} from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import {describe, expect, it} from 'vitest';
|
|
|
|
import NameFields from './NameFields';
|
|
|
|
function setup(names) {
|
|
const user = userEvent.setup();
|
|
render(
|
|
<NameFields
|
|
names={names}
|
|
field="alt_name"
|
|
noun="Alternate name"
|
|
buttonClass="altname"
|
|
help="Alternate name of crop."
|
|
renderInput={({id, name, value, onChange}) => (
|
|
<input id={id} name={name} value={value} onChange={(event) => onChange(event.target.value)} />
|
|
)}
|
|
/>,
|
|
);
|
|
return user;
|
|
}
|
|
|
|
const field = (number) => screen.getByLabelText(`Alternate name ${number}:`);
|
|
|
|
describe('NameFields', () => {
|
|
it('shows a field for each name', () => {
|
|
setup(['Sampaguita', 'Manol']);
|
|
expect(screen.getAllByRole('textbox')).toHaveLength(2);
|
|
});
|
|
|
|
it('fills each field with its name', () => {
|
|
setup(['Sampaguita', 'Manol']);
|
|
expect(field(2)).toHaveValue('Manol');
|
|
});
|
|
|
|
it('names the fields the way the controller reads them', () => {
|
|
setup(['Sampaguita']);
|
|
expect(field(1)).toHaveAttribute('name', 'alt_name[1]');
|
|
});
|
|
|
|
it('shows one empty field when there are no names', () => {
|
|
setup([]);
|
|
expect(field(1)).toHaveValue('');
|
|
});
|
|
|
|
it('shows an empty field for a blank name from a new crop', () => {
|
|
setup([null]);
|
|
expect(field(1)).toHaveValue('');
|
|
});
|
|
|
|
it('adds a field', async () => {
|
|
const user = setup(['Sampaguita']);
|
|
await user.click(screen.getByRole('button', {name: 'Add alternate name'}));
|
|
expect(field(2)).toHaveValue('');
|
|
});
|
|
|
|
it('keeps what was typed when a field is added', async () => {
|
|
const user = setup(['']);
|
|
await user.type(field(1), 'Manol');
|
|
await user.click(screen.getByRole('button', {name: 'Add alternate name'}));
|
|
expect(field(1)).toHaveValue('Manol');
|
|
});
|
|
|
|
it('removes the chosen field, not the last', async () => {
|
|
const user = setup(['Sampaguita', 'Manol']);
|
|
await user.click(screen.getByRole('button', {name: 'Remove alternate name 1'}));
|
|
expect(field(1)).toHaveValue('Manol');
|
|
});
|
|
|
|
it('renumbers the fields after one is removed', async () => {
|
|
const user = setup(['Sampaguita', 'Manol']);
|
|
await user.click(screen.getByRole('button', {name: 'Remove alternate name 1'}));
|
|
expect(screen.queryByLabelText('Alternate name 2:')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('cannot remove the only field', () => {
|
|
setup(['Sampaguita']);
|
|
expect(screen.getByRole('button', {name: 'Remove alternate name 1'})).toBeDisabled();
|
|
});
|
|
|
|
it('gives the buttons classes to find them by', () => {
|
|
setup(['Sampaguita']);
|
|
expect(screen.getByRole('button', {name: 'Add alternate name'})).toHaveClass('add-altname-row');
|
|
});
|
|
|
|
it('shows the help text', () => {
|
|
setup(['Sampaguita']);
|
|
expect(screen.getByText('Alternate name of crop.')).toBeInTheDocument();
|
|
});
|
|
});
|