import React from 'react'; import { screen, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { HelperText, HelperTextItem } from '../../HelperText'; import { DatePicker } from '../DatePicker'; jest.mock('../../../helpers/util.ts'); test('disabled date picker', () => { const { asFragment } = render(); expect(asFragment()).toMatchSnapshot(); }); test('Date picker with multiple validators does not show invalid icon on valid input', async () => { const user = userEvent.setup(); const rangeValidator = (date: Date) => { return ''; }; const rangeValidatorB = (date: Date) => { return ''; }; render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.getByRole('textbox')).not.toBeInvalid(); }); test('Error state can be cleared from outside', async () => { const rangeValidator = (date: Date) => { if (date < new Date('2020-03-17')) { return 'error'; } return ''; }; const user = userEvent.setup(); const { rerender } = render(); await user.clear(screen.getByRole('textbox')); await user.type(screen.getByRole('textbox'), '2020-03-16'); await user.click(document.body); rerender(); expect(screen.getByRole('textbox')).not.toBeInvalid(); }); test('With popover opened', async () => { const user = userEvent.setup(); const { asFragment } = render(); await user.click(screen.getByRole('button', { name: 'Toggle date picker' })); await screen.findByRole('button', { name: 'Previous month' }); expect(asFragment()).toMatchSnapshot(); }); test('Shows helperText instead of "Invalid date" when no error exists', () => { render( Help me } /> ); expect(screen.queryByText('Invalid date')).not.toBeInTheDocument(); expect(screen.getByText('Help me')).toBeVisible(); }); test('Shows "Invalid date" instead of helperText when text input contains invalid date', async () => { const user = userEvent.setup(); render( Help me } /> ); await user.type(screen.getByRole('textbox'), 'not a date'); await user.click(document.body); expect(screen.queryByText('Help me')).not.toBeInTheDocument(); expect(screen.getByText('Invalid date')).toBeVisible(); }); test('Does not render text input as invalid when requiredDateOptions.isRequired is false', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.getByRole('textbox')).not.toHaveAttribute('aria-invalid', 'true'); }); test('Does not render emptyDateText when requiredDateOptions.isRequired is false', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.queryByText('Date cannot be blank')).not.toBeInTheDocument; }); test('Renders text input as invalid on blur when requiredDateOptions.isRequired is true', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.getByRole('textbox')).toHaveAttribute('aria-invalid', 'true'); }); test('Renders default emptyDateText on blur when requiredDateOptions.isRequired is true', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.getByText('Date cannot be blank')).toBeInTheDocument(); }); test('Renders custom emptyDateText when requiredDateOptions.isRequired is true', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.getByText('Required in test')).toBeInTheDocument(); }); test('Shows emptyDateText instead of helperText when text input is empty and requiredDateOptions.isRequired is true', async () => { const user = userEvent.setup(); render( Help me } /> ); await user.click(screen.getByRole('textbox')); await user.click(document.body); expect(screen.queryByText('Help me')).not.toBeInTheDocument(); expect(screen.getByText('Date cannot be blank')).toBeVisible(); }); test('Renders text input as invalid when requiredDateOptions.isRequired is true and popover is closed without selection', async () => { const user = userEvent.setup(); render(); await user.click(screen.getByRole('button', { name: 'Toggle date picker' })); await user.click(document.body); expect(screen.getByRole('textbox')).toHaveAttribute('aria-invalid', 'true'); });