import * as React from 'react';
import deLocale from 'date-fns/locale/de';
import enLocale from 'date-fns/locale/en-US';
import 'dayjs/locale/de';
import TextField from '@material-ui/core/TextField';
import { screen, waitFor } from '@testing-library/react';
import { UtilClassToUse, getByMuiTest, utilsToUse, FakeTransitionComponent } from './test-utils';
import { createClientRender, fireEvent } from './createClientRender';
import {
DatePicker,
DatePickerProps,
DesktopDatePicker,
LocalizationProvider,
MobileDatePicker,
} from '../index';
describe('', () => {
const render = createClientRender({ strict: false });
it('Allows to select edge years from list', () => {
render(
}
/>
);
fireEvent.click(screen.getByRole('button', { name: '2010' }));
expect(getByMuiTest('datepicker-toolbar-date')).toHaveTextContent('Fri, Jan 1');
});
it("doesn't close picker on selection in Mobile mode", () => {
render(
}
/>
);
fireEvent.click(screen.getByRole('textbox'));
fireEvent.click(screen.getByLabelText('Jan 2, 2018'));
expect(screen.queryByRole('dialog')).toBeInTheDocument();
});
it('Closes picker on selection in Desktop mode', async () => {
render(
}
/>
);
fireEvent.click(screen.getByLabelText('Choose date, selected date is Jan 1, 2018'));
await waitFor(() => screen.getByRole('dialog'));
fireEvent.click(screen.getByLabelText('Jan 2, 2018'));
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
});
it("Prop `disableCloseOnSelect` – if `true` doesn't close picker", async () => {
render(
}
/>
);
fireEvent.click(screen.getByLabelText('Choose date, selected date is Jan 1, 2018'));
await waitFor(() => screen.getByRole('dialog'));
fireEvent.click(screen.getByLabelText('Jan 2, 2018'));
expect(screen.queryByRole('dialog')).toBeInTheDocument();
});
it('does not call onChange if same date selected', async () => {
const onChangeMock = jest.fn();
render(
}
/>
);
fireEvent.click(screen.getByLabelText('Choose date, selected date is Jan 1, 2018'));
await waitFor(() => screen.getByRole('dialog'));
fireEvent.click(screen.getByLabelText('Jan 1, 2018'));
expect(onChangeMock).not.toHaveBeenCalled();
});
describe('input validation', () => {
interface FormProps {
locale: any;
Picker: React.ElementType;
PickerProps: Partial;
}
const Form = (props: FormProps) => {
const { locale, Picker, PickerProps } = props;
const [value, setValue] = React.useState(new Date('01/01/2020'));
return (
}
value={value}
{...PickerProps}
/>
);
};
const tests = [
{
locale: 'en',
valid: 'January 2020',
invalid: 'Januar 2020',
dateFns: enLocale,
},
{
locale: 'de',
valid: 'Januar 2020',
invalid: 'Janua 2020',
dateFns: deLocale,
},
];
tests.forEach((test) => {
const { valid, invalid } = test;
const locale = process.env.UTILS === 'date-fns' ? test.dateFns : test.locale;
it(`${test.locale}: should set invalid`, () => {
render(
);
const input = screen.getByRole('textbox');
fireEvent.change(input, { target: { value: invalid } });
expect(input).toBeInvalid();
});
// Need to run with ICU loaded https://moment.github.io/luxon/docs/manual/install.html#node
if (process.env.UTILS === 'luxon') {
return;
}
it(`${test.locale}: should set to valid when was invalid`, () => {
render(
);
const input = screen.getByRole('textbox');
fireEvent.change(input, { target: { value: invalid } });
fireEvent.change(input, { target: { value: valid } });
expect(input).toBeValid();
});
});
});
});