import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import * as navigation 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(); 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', () => { jest.spyOn(navigation, 'navigateTo'); renderSimpleComponent(organization); userEvent.click(screen.getByRole('button')); expect(navigation.navigateTo).toHaveBeenCalledWith( `/organizations/org-slug/alerts/:projectId/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/proj-slug/wizard/' ); }); 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/project-slug/new/`, query: expect.objectContaining({ query: 'event.type:error ', }), }); }); });