import { screen } from '@testing-library/react';
import { setMonth, setYear } from 'date-fns';
import { DayPickerProps } from 'DayPicker';
import { customRender } from 'test/render';
import {
getMonthDropdown,
getYearDropdown,
queryMonthDropdown,
queryYearDropdown
} from 'test/selectors';
import { user } from 'test/user';
import { freezeBeforeAll } from 'test/utils';
import { CaptionProps } from 'components/Caption';
import { CustomComponents } from 'types/DayPickerBase';
import { CaptionDropdowns } from './CaptionDropdowns';
const today = new Date(2021, 8);
const fromYear = 2020;
const toYear = 2025;
freezeBeforeAll(today);
function setup(props: CaptionProps, dayPickerProps?: DayPickerProps) {
customRender(, dayPickerProps);
}
describe('when using a custom CaptionLabel component', () => {
const components: CustomComponents = {
CaptionLabel: () => <>custom label foo>
};
const props = { displayMonth: today };
beforeEach(() => {
setup(props, { components });
});
test('it should render the custom component instead', () => {
expect(screen.getByText('custom label foo')).toBeInTheDocument();
});
});
describe('when rendered with custom styles or classnames', () => {
let container: HTMLElement;
beforeEach(() => {
const dayPickerProps: DayPickerProps = {
captionLayout: 'dropdown',
fromYear,
toYear,
classNames: { caption_dropdowns: 'foo_dropdowns' },
styles: { caption_dropdowns: { color: 'red' } }
};
const view = customRender(
,
dayPickerProps
);
container = view.container;
});
test('should use the `caption_dropdowns` class name', () => {
expect(container.firstChild).toHaveClass('foo_dropdowns');
});
test('should use the `caption_dropdowns` style', () => {
expect(container.firstChild).toHaveStyle({ color: 'red' });
});
test('should render the month drop-down', () => {
expect(getMonthDropdown()).toBeInTheDocument();
});
test('should render the year drop-down', () => {
expect(getYearDropdown()).toBeInTheDocument();
});
});
describe('when a month is selected', () => {
const dayPickerProps: DayPickerProps = {
captionLayout: 'dropdown',
fromYear,
toYear,
onMonthChange: jest.fn()
};
beforeEach(() => {
customRender(, dayPickerProps);
});
describe('from the months drop-down', () => {
const newMonth = setMonth(today, 0);
beforeEach(async () => {
await user.selectOptions(
getMonthDropdown(),
newMonth.getMonth().toString()
);
});
test('should call the `onMonthChange` callback', () => {
expect(dayPickerProps.onMonthChange).toHaveBeenCalledWith(newMonth);
});
});
describe('from the years drop-down', () => {
const newYear = setYear(today, 2022);
beforeEach(async () => {
await user.selectOptions(
getYearDropdown(),
newYear.getFullYear().toString()
);
});
test('should call the `onMonthChange` callback', () => {
expect(dayPickerProps.onMonthChange).toHaveBeenCalledWith(newYear);
});
});
});
describe('when no date limits are set', () => {
const dayPickerProps: DayPickerProps = {
captionLayout: 'dropdown'
};
beforeEach(() => {
customRender(, dayPickerProps);
});
test('should not render the drop-downs', () => {
expect(queryMonthDropdown()).toBeNull();
expect(queryYearDropdown()).toBeNull();
});
});