import * as React from 'react';
import {
render,
screen
} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import * as TextControlBase from '@tesseract-design/web-base-textcontrol';
import { vi } from 'vitest';
import {
TextInput, TextInputType,
} from '.';
vi.mock('@tesseract-design/web-base-textcontrol');
describe('TextInput', () => {
it('renders a textbox', () => {
render(
);
const textbox = screen.getByRole('textbox');
expect(textbox).toBeInTheDocument();
expect(textbox).toHaveProperty('type', 'text');
});
it('renders a border', () => {
render(
);
const border = screen.getByTestId('border');
expect(border).toBeInTheDocument();
});
it('renders a label', () => {
render(
);
const textbox = screen.getByLabelText('foo');
expect(textbox).toBeInTheDocument();
const label = screen.getByTestId('label');
expect(label).toHaveTextContent('foo');
});
it('renders a hidden label', () => {
render(
);
const textbox = screen.getByLabelText('foo');
expect(textbox).toBeInTheDocument();
const label = screen.queryByTestId('label');
expect(label).toBeNull();
});
it('renders a hint', () => {
render(
);
const hint = screen.getByTestId('hint');
expect(hint).toBeInTheDocument();
});
it('renders an indicator', () => {
render(
}
/>
);
const indicator = screen.getByTestId('indicator');
expect(indicator).toBeInTheDocument();
});
describe.each(Object.values(TextControlBase.TextControlSize))('on %s size', (size) => {
it('renders input styles', () => {
render(
);
expect(TextControlBase.Input).toBeCalledWith(expect.objectContaining({
size,
}));
});
it('renders hint styles', () => {
render(
);
expect(TextControlBase.HintWrapper).toBeCalledWith(expect.objectContaining({
size,
}));
});
it('renders indicator styles', () => {
render(
}
/>
);
expect(TextControlBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
size,
}));
});
});
it('renders a block textbox', () => {
render(
);
expect(TextControlBase.Root).toBeCalledWith(expect.objectContaining({
block: true,
}));
});
it.each(Object.values(TextInputType))('renders a textbox with type %s', (buttonType) => {
render(
);
const textbox: HTMLButtonElement = screen.getByTestId('input');
expect(textbox).toHaveProperty('type', buttonType);
});
describe.each(Object.values(TextControlBase.TextControlStyle))('on %s style', (style) => {
it('renders input styles', () => {
render(
);
expect(TextControlBase.Input).toBeCalledWith(expect.objectContaining({
style,
}));
});
it('renders hint styles', () => {
render(
);
expect(TextControlBase.HintWrapper).toBeCalledWith(expect.objectContaining({
style,
}));
});
it('renders indicator styles', () => {
render(
}
/>
);
expect(TextControlBase.IndicatorWrapper).toBeCalledWith(expect.objectContaining({
style,
}));
});
});
it('handles change events', () => {
const onChange = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
render(
);
const textbox: HTMLInputElement = screen.getByRole('textbox');
userEvent.type(textbox, 'foobar');
expect(onChange).toBeCalled();
});
it('handles input events', () => {
const onInput = vi.fn().mockImplementationOnce((e) => { e.preventDefault() });
render(
);
const textbox: HTMLInputElement = screen.getByTestId('input');
userEvent.type(textbox, 'foobar');
expect(onInput).toBeCalled();
});
});