Files
sentinel/static/app/views/dashboards/releasesSelectControl.spec.tsx
2024-02-15 17:01:50 +00:00

146 lines
4.9 KiB
TypeScript

import {ReleaseFixture} from 'sentry-fixture/release';
import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import {ReleasesContext} from 'sentry/utils/releases/releasesProvider';
import ReleasesSelectControl from 'sentry/views/dashboards/releasesSelectControl';
import type {DashboardFilters} from 'sentry/views/dashboards/types';
function renderReleasesSelect({
onSearch,
handleChangeFilter,
}: {
handleChangeFilter?: (activeFilters: DashboardFilters) => void;
onSearch?: (searchTerm: string) => void;
}) {
render(
<ReleasesContext.Provider
value={{
releases: [
ReleaseFixture({
id: '1',
shortVersion: '[email protected]',
version: '[email protected]',
}),
ReleaseFixture({
id: '2',
shortVersion: '[email protected]',
version: '[email protected]',
}),
ReleaseFixture({
id: '3',
shortVersion: '[email protected]',
version: '[email protected]',
}),
],
loading: false,
onSearch: onSearch ?? jest.fn(),
}}
>
<ReleasesSelectControl
selectedReleases={[]}
handleChangeFilter={handleChangeFilter}
/>
</ReleasesContext.Provider>
);
}
describe('Dashboards > ReleasesSelectControl', function () {
it('updates menu title with selection', async function () {
renderReleasesSelect({});
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
expect(screen.getByText('Latest Release(s)')).toBeInTheDocument();
await userEvent.click(screen.getByText('[email protected]'));
await userEvent.click(document.body);
expect(screen.getByText('[email protected]')).toBeInTheDocument();
expect(screen.queryByText('+1')).not.toBeInTheDocument();
});
it('updates menu title with multiple selections', async function () {
renderReleasesSelect({});
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
await userEvent.click(screen.getByText('[email protected]'));
await userEvent.click(screen.getByText('[email protected]'));
await userEvent.click(document.body);
expect(screen.getByText('[email protected]')).toBeInTheDocument();
expect(screen.getByText('+1')).toBeInTheDocument();
});
it('calls onSearch when filtering by releases', async function () {
const mockOnSearch = jest.fn();
renderReleasesSelect({onSearch: mockOnSearch});
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
await userEvent.type(screen.getByPlaceholderText('Search\u2026'), 'se');
await waitFor(() => expect(mockOnSearch).toHaveBeenCalledWith('se'));
});
it('resets search on close', async function () {
const mockOnSearch = jest.fn();
renderReleasesSelect({onSearch: mockOnSearch});
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
await userEvent.type(screen.getByPlaceholderText('Search\u2026'), 'se');
await waitFor(() => expect(mockOnSearch).toHaveBeenCalledWith('se'));
await userEvent.click(document.body);
await waitFor(() => expect(mockOnSearch).toHaveBeenCalledWith(''));
});
it('triggers handleChangeFilter with the release versions', async function () {
const mockHandleChangeFilter = jest.fn();
renderReleasesSelect({handleChangeFilter: mockHandleChangeFilter});
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
await userEvent.click(screen.getByText('Latest Release(s)'));
await userEvent.click(screen.getByText('[email protected]'));
await userEvent.click(screen.getByText('[email protected]'));
await userEvent.click(document.body);
await waitFor(() => {
expect(mockHandleChangeFilter).toHaveBeenCalledWith({
release: ['latest', '[email protected]', '[email protected]'],
});
});
});
it('includes Latest Release(s) even if no matching releases', async function () {
render(
<ReleasesContext.Provider
value={{
releases: [],
loading: false,
onSearch: jest.fn(),
}}
>
<ReleasesSelectControl selectedReleases={[]} handleChangeFilter={jest.fn()} />
</ReleasesContext.Provider>
);
expect(screen.getByText('All Releases')).toBeInTheDocument();
await userEvent.click(screen.getByText('All Releases'));
await userEvent.type(screen.getByPlaceholderText('Search\u2026'), 'latest');
screen.getByText('Latest Release(s)');
});
});