import {initializeOrg} from 'sentry-test/initializeOrg'; import {act, render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import ProjectPageFilter from 'sentry/components/projectPageFilter'; import OrganizationStore from 'sentry/stores/organizationStore'; import PageFiltersStore from 'sentry/stores/pageFiltersStore'; import ProjectsStore from 'sentry/stores/projectsStore'; const {organization, router, routerContext} = initializeOrg({ organization: {features: ['global-views']}, project: undefined, projects: [ { id: 2, slug: 'project-2', }, ], router: { location: { pathname: '/organizations/org-slug/issues/', query: {}, }, params: {orgId: 'org-slug'}, }, }); describe('ProjectPageFilter', function () { beforeEach(() => { OrganizationStore.init(); PageFiltersStore.init(); PageFiltersStore.onInitializeUrlState( { projects: [], environments: [], datetime: {start: null, end: null, period: '14d', utc: null}, }, new Set() ); OrganizationStore.onUpdate(organization, {replace: true}); ProjectsStore.loadInitialData(organization.projects); }); afterEach(() => { PageFiltersStore.reset(); }); it('can pick project', function () { render(, { context: routerContext, organization, }); // Open the project dropdown expect(screen.getByText('My Projects')).toBeInTheDocument(); userEvent.click(screen.getByText('My Projects')); // Click the first project's checkbox const projectOptions = screen.getAllByTestId('checkbox-fancy'); userEvent.click(projectOptions[0]); // Confirm the selection changed the visible text expect(screen.queryByText('My Projects')).not.toBeInTheDocument(); // Close the dropdown userEvent.click(screen.getAllByText('project-2')[0]); // Verify we were redirected expect(router.push).toHaveBeenCalledWith( expect.objectContaining({query: {environment: [], project: ['2']}}) ); }); it('can pin selection', async function () { render(, { context: routerContext, organization, }); // Open the project dropdown expect(screen.getByText('My Projects')).toBeInTheDocument(); userEvent.click(screen.getByText('My Projects')); // Click the pin button const pinButton = screen.getByRole('button', {name: 'Lock filter'}); userEvent.click(pinButton, undefined, {skipHover: true}); await screen.findByRole('button', {name: 'Lock filter', pressed: true}); // Check if the pin indicator has been added expect(screen.getByLabelText('Filter applied across pages')).toBeInTheDocument(); expect(PageFiltersStore.getState()).toEqual( expect.objectContaining({ pinnedFilters: new Set(['projects']), }) ); }); it('can quick select', async function () { render(, { context: routerContext, organization, }); // Open the project dropdown expect(screen.getByText('My Projects')).toBeInTheDocument(); userEvent.click(screen.getByText('My Projects')); // Click the first project's checkbox userEvent.click(screen.getByText('project-2')); expect(router.push).toHaveBeenCalledWith( expect.objectContaining({query: {environment: [], project: ['2']}}) ); await screen.findByText('project-2'); await waitFor(() => expect(PageFiltersStore.getState()).toEqual( expect.objectContaining({ isReady: true, selection: { datetime: { end: null, period: '14d', start: null, utc: null, }, environments: [], projects: [2], }, }) ) ); }); it('will change projects when page filter selection changes, e.g. from back button nav', async function () { render(, { context: routerContext, organization, }); // Confirm initial selection expect(screen.getByText('My Projects')).toBeInTheDocument(); // Edit page filter project selection act(() => { PageFiltersStore.updateProjects([2], []); }); // Page filter selection change should affect project page filter expect(await screen.findByText('project-2')).toBeInTheDocument(); }); });