import React from 'react';
import { waitFor, fireEvent } from '@testing-library/react';
import renderWithTheme from '../../../../testUtils/renderWithTheme';
import DoubleCalendar from '../DoubleCalendar';
describe('rendering', () => {
it('renders double calendar', async () => {
const { getAllByText, getByTestId } = renderWithTheme(
);
await waitFor(() => {
const firstMonthSelect = getByTestId('first-month-select');
const firstYearSelect = getByTestId('first-year-select');
const secondMonthSelect = getByTestId('second-month-select');
const secondYearSelect = getByTestId('second-year-select');
expect(firstMonthSelect).toSelectItem('Feb');
expect(firstYearSelect).toSelectItem('2021');
expect(secondMonthSelect).toSelectItem('Mar');
expect(secondYearSelect).toSelectItem('2021');
// shows days of week
expect(getAllByText('Su').length).toBe(2);
expect(getAllByText('Mo').length).toBe(2);
expect(getAllByText('Tu').length).toBe(2);
expect(getAllByText('We').length).toBe(2);
expect(getAllByText('Th').length).toBe(2);
expect(getAllByText('Fr').length).toBe(2);
expect(getAllByText('Sa').length).toBe(2);
// shows normal/selected dates
expect(getAllByText('19').length).toBe(2);
expect(getAllByText('23').length).toBe(2);
expect(getAllByText('25').length).toBe(2);
// shows disabled date
expect(getAllByText('31').length).toBe(2);
expect(getAllByText('26').length).toBe(2);
});
});
});
describe('interaction', () => {
it('allows to select month and year', async () => {
const { getAllByText, getByTestId } = renderWithTheme(
);
const firstMonthSelect = getByTestId('first-month-select');
const firstYearSelect = getByTestId('first-year-select');
const secondMonthSelect = getByTestId('second-month-select');
const secondYearSelect = getByTestId('second-year-select');
fireEvent.click(firstMonthSelect);
fireEvent.click(getAllByText('Dec')[0]);
await waitFor(() => {
expect(firstMonthSelect).toSelectItem('Dec');
expect(firstYearSelect).toSelectItem('2021');
expect(secondMonthSelect).toSelectItem('Jan');
expect(secondYearSelect).toSelectItem('2022');
});
fireEvent.click(secondMonthSelect);
fireEvent.click(getAllByText('May')[1]);
await waitFor(() => {
expect(firstMonthSelect).toSelectItem('Apr');
expect(firstYearSelect).toSelectItem('2022');
expect(secondMonthSelect).toSelectItem('May');
expect(secondYearSelect).toSelectItem('2022');
});
fireEvent.click(firstMonthSelect);
fireEvent.click(getAllByText('2023')[0]);
await waitFor(() => {
expect(firstYearSelect).toSelectItem('2023');
expect(secondYearSelect).toSelectItem('2023');
});
fireEvent.click(secondYearSelect);
fireEvent.click(getAllByText('2025')[1]);
await waitFor(() => {
expect(firstYearSelect).toSelectItem('2025');
expect(secondYearSelect).toSelectItem('2025');
});
});
it('allows to select a date', async () => {
const onSelectDate = jest.fn();
const { getAllByText, getByTestId } = renderWithTheme(
);
fireEvent.click(getByTestId('first-month-select'));
fireEvent.click(getAllByText('Dec')[0]);
fireEvent.click(getAllByText(2)[2]);
await waitFor(() => {
expect(onSelectDate).toHaveBeenCalledTimes(1);
expect(onSelectDate).toHaveBeenCalledWith(new Date(2022, 0, 2));
});
});
it('does not allow to select a new date out of range', async () => {
const onSelectDate = jest.fn();
const { getAllByText } = renderWithTheme(
);
fireEvent.click(getAllByText(2)[1]);
await waitFor(() => {
expect(onSelectDate).not.toHaveBeenCalled();
});
});
});