import {mountWithTheme} from 'sentry-test/enzyme'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {mountGlobalModal} from 'sentry-test/modal'; import TeamNotificationSettings from 'sentry/views/settings/organizationTeams/teamNotifications'; const EXTERNAL_NAME = 'marcos'; const EXAMPLE_EXTERNAL_TEAM = { externalName: EXTERNAL_NAME, id: '1', integrationId: '1', provider: 'slack', }; const EXAMPLE_INTEGRATION = { id: '1', provider: { key: 'slack', }, }; describe('TeamNotificationSettings', () => { let team; beforeEach(() => { MockApiClient.clearMockResponses(); team = TestStubs.Team(); }); it('should render empty message when there are no integrations', () => { const {organization, routerContext} = initializeOrg(); MockApiClient.addMockResponse({ url: `/teams/${organization.slug}/${team.slug}/`, body: { externalTeams: [EXAMPLE_EXTERNAL_TEAM], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/`, body: [], }); const wrapper = mountWithTheme( , routerContext ); const emptyMessage = wrapper.find('Panel div[data-test-id="empty-message"]'); expect(emptyMessage).toHaveLength(1); expect(emptyMessage.text()).toBe( 'No Notification Integrations have been installed yet.' ); }); it('should render empty message when there are no externalTeams', () => { const {organization, routerContext} = initializeOrg(); MockApiClient.addMockResponse({ url: `/teams/${organization.slug}/${team.slug}/`, body: { externalTeams: [], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/`, body: [EXAMPLE_INTEGRATION], }); const wrapper = mountWithTheme( , routerContext ); const emptyMessage = wrapper.find('Panel div[data-test-id="empty-message"]'); expect(emptyMessage).toHaveLength(1); expect(emptyMessage.find('div div div').first().text()).toBe( 'No teams have been linked yet.' ); }); it('should render each externalTeam', () => { const {organization, routerContext} = initializeOrg(); MockApiClient.addMockResponse({ url: `/teams/${organization.slug}/${team.slug}/`, body: { externalTeams: [EXAMPLE_EXTERNAL_TEAM], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/`, body: [EXAMPLE_INTEGRATION], }); const wrapper = mountWithTheme( , routerContext ); const input = wrapper.find('Panel').last().find('input'); expect(input.prop('disabled')).toBe(true); expect(input.prop('value')).toBe(EXTERNAL_NAME); expect(wrapper.find('button[aria-label="delete"]').exists()).toBe(true); }); it('should delete be able to delete the externalTeam', async () => { const {organization, routerContext} = initializeOrg(); MockApiClient.addMockResponse({ url: `/teams/${organization.slug}/${team.slug}/`, body: { externalTeams: [EXAMPLE_EXTERNAL_TEAM], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/`, body: [EXAMPLE_INTEGRATION], }); const deleteMock = MockApiClient.addMockResponse({ url: `/teams/${organization.slug}/${team.slug}/external-teams/${EXAMPLE_EXTERNAL_TEAM.id}/`, status: 204, method: 'DELETE', }); const wrapper = mountWithTheme( , routerContext ); const deleteButton = wrapper.find('button[aria-label="delete"]'); expect(deleteButton.prop('disabled')).toBe(false); deleteButton.simulate('click'); await tick(); const modal = await mountGlobalModal(); const confirmBtn = modal.find('Button').last().simulate('click'); expect(confirmBtn.exists()).toBe(true); confirmBtn.simulate('click'); expect(deleteMock).toHaveBeenCalled(); }); });