mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2024-12-23 09:30:31 +03:00
Added test for ShortUrlsFilterDropdown
This commit is contained in:
parent
1c39e3402b
commit
c25b74de84
2 changed files with 44 additions and 6 deletions
|
@ -5,23 +5,40 @@ import { ShortUrlsFilter } from '../data';
|
||||||
|
|
||||||
interface ShortUrlsFilterDropdownProps {
|
interface ShortUrlsFilterDropdownProps {
|
||||||
onChange: (filters: ShortUrlsFilter) => void;
|
onChange: (filters: ShortUrlsFilter) => void;
|
||||||
|
supportsDisabledFiltering: boolean;
|
||||||
selected?: ShortUrlsFilter;
|
selected?: ShortUrlsFilter;
|
||||||
className?: string;
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ShortUrlsFilterDropdown = (
|
export const ShortUrlsFilterDropdown = (
|
||||||
{ onChange, selected = {}, className }: ShortUrlsFilterDropdownProps,
|
{ onChange, selected = {}, className, supportsDisabledFiltering }: ShortUrlsFilterDropdownProps,
|
||||||
) => {
|
) => {
|
||||||
const { excludeBots = false } = selected;
|
const { excludeBots = false, excludeMaxVisitsReached = false, excludePastValidUntil = false } = selected;
|
||||||
const onBotsClick = () => onChange({ ...selected, excludeBots: !selected?.excludeBots });
|
const onFilterClick = (key: keyof ShortUrlsFilter) => () => onChange({ ...selected, [key]: !selected?.[key] });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownBtn text="Filters" dropdownClassName={className} className="me-3" right minWidth={250}>
|
<DropdownBtn text="Filters" dropdownClassName={className} className="me-3" right minWidth={250}>
|
||||||
<DropdownItem header>Bots:</DropdownItem>
|
<DropdownItem header>Visits:</DropdownItem>
|
||||||
<DropdownItem active={excludeBots} onClick={onBotsClick}>Exclude bots visits</DropdownItem>
|
<DropdownItem active={excludeBots} onClick={onFilterClick('excludeBots')}>Ignore visits from bots</DropdownItem>
|
||||||
|
|
||||||
|
{supportsDisabledFiltering && (
|
||||||
|
<>
|
||||||
|
<DropdownItem divider />
|
||||||
|
<DropdownItem header>Short URLs:</DropdownItem>
|
||||||
|
<DropdownItem active={excludeMaxVisitsReached} onClick={onFilterClick('excludeMaxVisitsReached')}>
|
||||||
|
Exclude with visits reached
|
||||||
|
</DropdownItem>
|
||||||
|
<DropdownItem active={excludePastValidUntil} onClick={onFilterClick('excludePastValidUntil')}>
|
||||||
|
Exclude enabled in the past
|
||||||
|
</DropdownItem>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<DropdownItem divider />
|
<DropdownItem divider />
|
||||||
<DropdownItem disabled={!hasValue(selected)} onClick={() => onChange({ excludeBots: false })}>
|
<DropdownItem
|
||||||
|
disabled={!hasValue(selected)}
|
||||||
|
onClick={() => onChange({ excludeBots: false, excludeMaxVisitsReached: false, excludePastValidUntil: false })}
|
||||||
|
>
|
||||||
<i>Clear filters</i>
|
<i>Clear filters</i>
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
</DropdownBtn>
|
</DropdownBtn>
|
||||||
|
|
21
test/short-urls/helpers/ShortUrlsFilterDropdown.test.tsx
Normal file
21
test/short-urls/helpers/ShortUrlsFilterDropdown.test.tsx
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import { screen, waitFor } from '@testing-library/react';
|
||||||
|
import { ShortUrlsFilterDropdown } from '../../../src/short-urls/helpers/ShortUrlsFilterDropdown';
|
||||||
|
import { renderWithEvents } from '../../__helpers__/setUpTest';
|
||||||
|
|
||||||
|
describe('<ShortUrlsFilterDropdown />', () => {
|
||||||
|
const setUp = (supportsDisabledFiltering: boolean) => renderWithEvents(
|
||||||
|
<ShortUrlsFilterDropdown onChange={jest.fn()} supportsDisabledFiltering={supportsDisabledFiltering} />,
|
||||||
|
);
|
||||||
|
|
||||||
|
it.each([
|
||||||
|
[true, 3],
|
||||||
|
[false, 1],
|
||||||
|
])('displays proper amount of menu items', async (supportsDisabledFiltering, expectedItems) => {
|
||||||
|
const { user } = setUp(supportsDisabledFiltering);
|
||||||
|
|
||||||
|
await user.click(screen.getByRole('button', { name: 'Filters' }));
|
||||||
|
await waitFor(() => expect(screen.getByRole('menu')).toBeInTheDocument());
|
||||||
|
|
||||||
|
expect(screen.getAllByRole('menuitem')).toHaveLength(expectedItems);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue