import {EventFixture} from 'sentry-fixture/event'; import {EventsStatsFixture} from 'sentry-fixture/events'; import {GroupFixture} from 'sentry-fixture/group'; import {LocationFixture} from 'sentry-fixture/locationFixture'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {RouterFixture} from 'sentry-fixture/routerFixture'; import {TagsFixture} from 'sentry-fixture/tags'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import PageFiltersStore from 'sentry/stores/pageFiltersStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import {EventDetailsHeader} from './eventDetailsHeader'; const mockUseNavigate = jest.fn(); jest.mock('sentry/utils/useNavigate', () => ({ useNavigate: () => mockUseNavigate, })); describe('EventDetailsHeader', () => { const organization = OrganizationFixture(); const project = ProjectFixture({ environments: ['production', 'staging', 'development'], }); const group = GroupFixture(); const event = EventFixture({id: 'event-id'}); const defaultProps = {group, event, project}; const router = RouterFixture({ location: LocationFixture({query: {streamline: '1'}}), }); beforeEach(() => { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/issues/${group.id}/tags/`, body: TagsFixture(), method: 'GET', }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/releases/stats/`, body: [], }); PageFiltersStore.init(); PageFiltersStore.onInitializeUrlState( { projects: [], environments: [], datetime: {start: null, end: null, period: '14d', utc: null}, }, new Set(['environments']) ); ProjectsStore.loadInitialData([project]); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events-stats/`, body: {'count()': EventsStatsFixture(), 'count_unique(user)': EventsStatsFixture()}, method: 'GET', }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: {data: [{'count_unique(user)': 21}]}, }); }); it('renders filters alongside the graph', async function () { render(, {organization, router}); expect(await screen.findByTestId('event-graph-loading')).not.toBeInTheDocument(); expect(screen.getByRole('button', {name: 'All Envs'})).toBeInTheDocument(); expect(screen.getByRole('button', {name: '14D'})).toBeInTheDocument(); expect(screen.getByPlaceholderText('Filter events\u2026')).toBeInTheDocument(); expect( screen.getByRole('button', { name: 'Toggle graph series - Events', }) ).toBeInTheDocument(); expect( screen.getByRole('button', {name: 'Toggle graph series - Users'}) ).toBeInTheDocument(); expect(screen.getByRole('figure')).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Close sidebar'})).toBeInTheDocument(); }); it('updates the query params with search tokens', async function () { const [tagKey, tagValue] = ['user.email', 'leander.rodrigues@sentry.io']; const locationQuery = { query: { ...router.location.query, query: `${tagKey}:${tagValue}`, }, }; MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/tags/${tagKey}/values/`, body: [ { key: tagKey, name: tagValue, value: tagValue, }, ], method: 'GET', }); render(, {organization, router}); expect(await screen.findByTestId('event-graph-loading')).not.toBeInTheDocument(); const search = screen.getByPlaceholderText('Filter events\u2026'); await userEvent.type(search, `${tagKey}:`); await userEvent.keyboard(`${tagValue}{enter}{enter}`); expect(mockUseNavigate).toHaveBeenCalledWith(expect.objectContaining(locationQuery), { replace: true, }); }); });