import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import {navigateTo} from 'sentry/actionCreators/navigation'; import CreateAlertButton, { CreateAlertFromViewButton, } from 'sentry/components/createAlertButton'; import GuideStore from 'sentry/stores/guideStore'; import EventView from 'sentry/utils/discover/eventView'; import {DEFAULT_EVENT_VIEW} from 'sentry/views/eventsV2/data'; const onClickMock = jest.fn(); const context = TestStubs.routerContext(); jest.mock('sentry/actionCreators/navigation'); function renderComponent(organization, eventView) { return render( , {context} ); } function renderSimpleComponent(organization, extraProps) { return render(); } describe('CreateAlertFromViewButton', () => { const organization = TestStubs.Organization(); afterEach(() => { jest.resetAllMocks(); }); it('should trigger onClick callback', () => { const eventView = EventView.fromSavedQuery({ ...DEFAULT_EVENT_VIEW, query: 'event.type:error', projects: [2], }); renderComponent(organization, eventView); userEvent.click(screen.getByRole('button', {name: 'Create Alert'})); expect(onClickMock).toHaveBeenCalledTimes(1); }); it('disables the create alert button for members', () => { const eventView = EventView.fromSavedQuery({ ...DEFAULT_EVENT_VIEW, }); const noAccessOrg = { ...organization, access: [], }; renderComponent(noAccessOrg, eventView); expect(screen.getByRole('button', {name: 'Create Alert'})).toBeDisabled(); }); it('shows a guide for members', () => { const noAccessOrg = { ...organization, access: [], }; renderSimpleComponent(noAccessOrg, { showPermissionGuide: true, }); expect(GuideStore.state.anchors).toEqual(new Set(['alerts_write_member'])); }); it('shows a guide for owners/admins', () => { const adminAccessOrg = { ...organization, access: ['org:write'], }; renderSimpleComponent(adminAccessOrg, { showPermissionGuide: true, }); expect(GuideStore.state.anchors).toEqual(new Set(['alerts_write_owner'])); }); it('redirects to alert wizard with no project', () => { renderSimpleComponent(organization); userEvent.click(screen.getByRole('button')); expect(navigateTo).toHaveBeenCalledWith( `/organizations/org-slug/alerts/wizard/?`, undefined ); }); it('redirects to alert wizard with a project', () => { renderSimpleComponent(organization, { projectSlug: 'proj-slug', }); expect(screen.getByRole('button')).toHaveAttribute( 'href', '/organizations/org-slug/alerts/wizard/?project=proj-slug' ); }); it('removes a duplicate project filter', () => { const eventView = EventView.fromSavedQuery({ ...DEFAULT_EVENT_VIEW, query: 'event.type:error project:project-slug', projects: [2], }); renderComponent(organization, eventView); userEvent.click(screen.getByRole('button')); expect(context.context.router.push).toHaveBeenCalledWith({ pathname: `/organizations/org-slug/alerts/new/metric/`, query: expect.objectContaining({ query: 'event.type:error ', project: 'project-slug', }), }); }); });