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(); }); });