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 {
MaskedTextInput
} from '.';
vi.mock('@tesseract-design/web-base-textcontrol');
describe('MaskedTextInput', () => {
it('renders an input', () => {
render(
);
const textbox: HTMLInputElement = screen.getByTestId('input');
expect(textbox).toBeInTheDocument();
expect(textbox).toHaveProperty('type', 'password');
});
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 input', () => {
render(
);
expect(TextControlBase.Root).toBeCalledWith(expect.objectContaining({
block: true,
}));
});
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.getByTestId('input');
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();
});
});