import { shallow, ShallowWrapper } from 'enzyme'; import { DropdownItem } from 'reactstrap'; import { Mock } from 'ts-mockery'; import { DateRangeSelector, DateRangeSelectorProps } from '../../../src/utils/dates/DateRangeSelector'; import { DateInterval } from '../../../src/utils/dates/types'; import { DateIntervalDropdownItems } from '../../../src/utils/dates/DateIntervalDropdownItems'; import DateRangeRow from '../../../src/utils/dates/DateRangeRow'; describe('', () => { let wrapper: ShallowWrapper; const onDatesChange = jest.fn(); const createWrapper = (props: Partial = {}) => { wrapper = shallow( (props)} defaultText="Default text" onDatesChange={onDatesChange} />, ); return wrapper; }; afterEach(jest.clearAllMocks); afterEach(() => wrapper?.unmount()); it('renders proper amount of items', () => { const wrapper = createWrapper(); const items = wrapper.find(DropdownItem); const dateIntervalItems = wrapper.find(DateIntervalDropdownItems); expect(items).toHaveLength(3); expect(dateIntervalItems).toHaveLength(1); expect(items.filter('[divider]')).toHaveLength(1); expect(items.filter('[header]')).toHaveLength(1); expect(items.filter('[text]')).toHaveLength(1); }); it.each([ [undefined, 0], ['all' as DateInterval, 1], ['today' as DateInterval, 1], ['yesterday' as DateInterval, 1], ['last7Days' as DateInterval, 1], ['last30Days' as DateInterval, 1], ['last90Days' as DateInterval, 1], ['last180Days' as DateInterval, 1], ['last365Days' as DateInterval, 1], [{ startDate: new Date() }, 0], ])('sets proper element as active based on provided date range', (initialDateRange, expectedActiveIntervalItems) => { const wrapper = createWrapper({ initialDateRange }); const dateIntervalItems = wrapper.find(DateIntervalDropdownItems).filterWhere( (item) => item.prop('active') !== undefined, ); expect(dateIntervalItems).toHaveLength(expectedActiveIntervalItems); }); it('triggers onDatesChange callback when selecting an element', () => { const wrapper = createWrapper(); const dates = wrapper.find(DateRangeRow); const dateIntervalItems = wrapper.find(DateIntervalDropdownItems); dates.simulate('startDateChange', null); dates.simulate('endDateChange', null); dateIntervalItems.simulate('change'); expect(onDatesChange).toHaveBeenCalledTimes(3); }); it('propagates default text to DateIntervalDropdownItems', () => { const wrapper = createWrapper(); const dateIntervalItems = wrapper.find(DateIntervalDropdownItems); expect(dateIntervalItems.prop('allText')).toEqual('Default text'); }); });