import {TeamFixture} from 'sentry-fixture/team';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {
render,
renderGlobalModal,
screen,
userEvent,
} from 'sentry-test/reactTestingLibrary';
import type {ExternalTeam} from 'sentry/types/integrations';
import TeamNotificationSettings from 'sentry/views/settings/organizationTeams/teamNotifications';
const EXTERNAL_NAME = 'marcos';
const EXAMPLE_EXTERNAL_TEAM: ExternalTeam = {
externalName: EXTERNAL_NAME,
id: '1',
integrationId: '1',
provider: 'slack',
teamId: '1',
};
const EXAMPLE_INTEGRATION = {
id: '1',
provider: {
key: 'slack',
},
};
describe('TeamNotificationSettings', () => {
const teamWithExternalTeam = TeamFixture({
externalTeams: [EXAMPLE_EXTERNAL_TEAM],
});
const teamWithoutExternalTeam = TeamFixture();
const {organization, router} = initializeOrg({
router: {params: {teamId: teamWithExternalTeam.slug}},
});
beforeEach(() => {
MockApiClient.clearMockResponses();
});
it('should render empty message when there are no integrations', async () => {
MockApiClient.addMockResponse({
url: `/teams/${organization.slug}/${teamWithExternalTeam.slug}/`,
body: teamWithExternalTeam,
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/integrations/`,
body: [],
});
render(, {router, organization});
expect(
await screen.findByText('No Notification Integrations have been installed yet.')
).toBeInTheDocument();
});
it('should render empty message when there are no externalTeams', async () => {
MockApiClient.addMockResponse({
url: `/teams/${organization.slug}/${teamWithExternalTeam.slug}/`,
body: teamWithoutExternalTeam,
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/integrations/`,
body: [EXAMPLE_INTEGRATION],
});
render(, {router, organization});
expect(await screen.findByText('No teams have been linked yet.')).toBeInTheDocument();
});
it('should render each externalTeam', async () => {
MockApiClient.addMockResponse({
url: `/teams/${organization.slug}/${teamWithExternalTeam.slug}/`,
body: teamWithExternalTeam,
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/integrations/`,
body: [EXAMPLE_INTEGRATION],
});
render(, {router, organization});
const input = await screen.findByRole('textbox', {
name: 'Unlink this channel in slack with `/slack unlink team`',
});
expect(input).toBeDisabled();
expect(input).toHaveValue(EXTERNAL_NAME);
expect(screen.getByRole('button', {name: 'Unlink'})).toBeInTheDocument();
});
it('should delete be able to delete the externalTeam', async () => {
MockApiClient.addMockResponse({
url: `/teams/${organization.slug}/${teamWithExternalTeam.slug}/`,
body: teamWithExternalTeam,
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/integrations/`,
body: [EXAMPLE_INTEGRATION],
});
const deleteMock = MockApiClient.addMockResponse({
url: `/teams/${organization.slug}/${teamWithExternalTeam.slug}/external-teams/${EXAMPLE_EXTERNAL_TEAM.id}/`,
status: 204,
method: 'DELETE',
});
render(, {router, organization});
await userEvent.click(await screen.findByRole('button', {name: 'Unlink'}));
renderGlobalModal();
await userEvent.click(screen.getByTestId('confirm-button'));
expect(deleteMock).toHaveBeenCalled();
});
});