import {GitHubIntegrationProviderFixture} from 'sentry-fixture/githubIntegrationProvider'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {OrganizationIntegrationsFixture} from 'sentry-fixture/organizationIntegrations'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import type {OrganizationIntegration} from 'sentry/types/integrations'; import IssueAlertNotificationOptions, { type IssueAlertNotificationProps, } from 'sentry/views/projectInstall/issueAlertNotificationOptions'; describe('MessagingIntegrationAlertRule', function () { const organization = OrganizationFixture({ features: ['messaging-integration-onboarding-project-creation'], }); const integrations: OrganizationIntegration[] = []; const mockSetAction = jest.fn(); const notificationProps: IssueAlertNotificationProps = { actions: [], channel: 'channel', integration: undefined, provider: 'slack', providersToIntegrations: {}, querySuccess: true, shouldRenderSetupButton: false, setActions: mockSetAction, setChannel: jest.fn(), setIntegration: jest.fn(), setProvider: jest.fn(), }; const getComponent = () => ; it('renders setup button if no integrations are active', async function () { const providers = (providerKey: string) => [ GitHubIntegrationProviderFixture({key: providerKey}), ]; const providerKeys = ['slack', 'discord', 'msteams']; const mockResponses: jest.Mock[] = []; providerKeys.forEach(providerKey => { mockResponses.push( MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/config/integrations/?provider_key=${providerKey}`, body: {providers: providers(providerKey)}, }) ); }); mockResponses.push( MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/?integrationType=messaging`, body: [], }) ); render( , {organization: organization} ); await screen.findByText(/notify via email/i); expect(screen.queryByText(/notify via integration/i)).not.toBeInTheDocument(); await screen.findByRole('button', {name: /connect to messaging/i}); mockResponses.forEach(mock => { expect(mock).toHaveBeenCalled(); }); }); it('renders alert configuration if integration is installed', async function () { integrations.push( OrganizationIntegrationsFixture({ name: "Moo Toon's Workspace", status: 'active', }) ); render(getComponent(), {organization: organization}); await screen.findByText(/notify via email/i); await screen.findByText(/notify via integration/i); }); it('calls setter when new integration option is selected', async function () { integrations.push( OrganizationIntegrationsFixture({ name: "Moo Toon's Workspace", status: 'active', }) ); render(getComponent(), {organization: organization}); await screen.findByText(/notify via email/i); await screen.findByText(/notify via integration/i); await userEvent.click(screen.getByText(/notify via integration/i)); expect(mockSetAction).toHaveBeenCalled(); }); });