import {GitHubIntegrationProviderFixture} from 'sentry-fixture/githubIntegrationProvider'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import AddIntegrationRow from 'sentry/views/alerts/rules/issue/addIntegrationRow'; jest.mock('sentry/actionCreators/modal'); describe('AddIntegrationRow', function () { let project, org; const integrationSlug = 'github'; const providers = [GitHubIntegrationProviderFixture()]; beforeEach(function () { MockApiClient.clearMockResponses(); project = ProjectFixture(); org = OrganizationFixture(); jest.clearAllMocks(); }); const getComponent = () => ( ); it('renders', async () => { MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/config/integrations/?provider_key=${integrationSlug}`, body: { providers: providers, }, }); render(getComponent()); const button = await screen.findByRole('button', {name: /add integration/i}); expect(button).toBeInTheDocument(); }); it('opens the setup dialog on click', async () => { const focus = jest.fn(); const open = jest.fn().mockReturnValue({focus, close: jest.fn()}); // any is needed here because getSentry has different types for global (global as any).open = open; const mock1 = MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/config/integrations/?provider_key=${integrationSlug}`, body: { providers: providers, }, }); render(getComponent()); expect(mock1).toHaveBeenCalled(); const button = await screen.findByRole('button', {name: /add integration/i}); await userEvent.click(button); expect(open.mock.calls).toHaveLength(1); expect(focus.mock.calls).toHaveLength(1); expect(open.mock.calls[0][2]).toBe( 'scrollbars=yes,width=100,height=100,top=334,left=462' ); }); it('handles API error', async () => { const setHasError = jest.fn(); MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/config/integrations/?provider_key=${integrationSlug}`, statusCode: 400, body: {error: 'internal error'}, }); render( ); await waitFor(() => { expect(setHasError).toHaveBeenCalled(); }); }); });