import React, { useState } from 'react' import { render, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { type DateRange } from '~components/Calendar' import { FilterButton } from '~components/Filter/FilterButton' import { FilterDateRangePicker, type FilterDateRangePickerProps } from './index' const user = userEvent.setup() const FilterDateRangePickerWrapper = ({ selectedRange, ...restProps }: Partial): JSX.Element => { const [isOpen, setIsOpen] = useState(false) const [selectedDateRange, setSelectedDateRange] = useState(selectedRange) return ( } label="Dates" selectedRange={selectedDateRange} onRangeChange={setSelectedDateRange} locale="en-AU" {...restProps} /> ) } describe('', () => { it('should not show the calendar initially', () => { const { queryByRole } = render() expect(queryByRole('dialog')).not.toBeInTheDocument() }) describe('Filter button', () => { it('should show the selected range in the button', () => { const { getByRole } = render( , ) const filterButton = getByRole('button', { name: 'Dates : 1 May 2022 - 25 Nov 2022', }) expect(filterButton).toBeVisible() }) it('should not show the selected range in the button if the range is not valid', () => { const { getByRole } = render( , ) const filterButton = getByRole('button', { name: 'Dates' }) expect(filterButton).toBeVisible() }) it('should not show a selected value in the button if there is only a partial date range', () => { const { getByRole } = render( , ) const filterButton = getByRole('button', { name: 'Dates' }) expect(filterButton).toBeVisible() }) it('should show the calendar when the filter button is clicked', async () => { const { queryByRole, getByRole, getByText } = render( , ) expect(queryByRole('dialog')).not.toBeInTheDocument() const filterButton = getByRole('button', { name: 'Dates' }) await user.click(filterButton) await waitFor(() => { expect(getByText('May 2022')).toBeVisible() }) }) it('should not show a date range in the button if the selected range is not valid', async () => { const { getByRole, getByLabelText } = render( , ) const filterButton = getByRole('button', { name: 'Dates' }) await user.click(filterButton) await waitFor(() => { expect(getByRole('dialog')).toBeVisible() }) const inputEndDate = getByLabelText('Date to') await user.clear(inputEndDate) await user.type(inputEndDate, '01/04/2022') await user.tab() await waitFor(() => { expect(inputEndDate).not.toHaveFocus() }) }, 10000) }) })