import {browserHistory} from 'react-router'; import selectEvent from 'react-select-event'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {TeamFixture} from 'sentry-fixture/team'; import {initializeOrg} from 'sentry-test/initializeOrg'; import { render, renderGlobalModal, screen, userEvent, waitFor, } from 'sentry-test/reactTestingLibrary'; import TeamStore from 'sentry/stores/teamStore'; import TeamSettings from 'sentry/views/settings/organizationTeams/teamSettings'; describe('TeamSettings', function () { const {routerProps} = initializeOrg(); beforeEach(function () { TeamStore.reset(); MockApiClient.clearMockResponses(); jest.spyOn(window.location, 'assign'); }); afterEach(function () { jest.mocked(window.location.assign).mockRestore(); }); it('can change slug', async function () { const team = TeamFixture(); const putMock = MockApiClient.addMockResponse({ url: `/teams/org-slug/${team.slug}/`, method: 'PUT', body: { slug: 'new-slug', }, }); render(); const input = screen.getByRole('textbox', {name: 'Team Slug'}); await userEvent.clear(input); await userEvent.type(input, 'NEW SLUG'); await userEvent.click(screen.getByRole('button', {name: 'Save'})); expect(putMock).toHaveBeenCalledWith( `/teams/org-slug/${team.slug}/`, expect.objectContaining({ data: { slug: 'new-slug', }, }) ); await waitFor(() => expect(browserHistory.replace).toHaveBeenCalledWith( '/settings/org-slug/teams/new-slug/settings/' ) ); }); it('can set team org-role', async function () { const team = TeamFixture({orgRole: ''}); const putMock = MockApiClient.addMockResponse({ url: `/teams/org-slug/${team.slug}/`, method: 'PUT', body: { slug: 'new-slug', orgRole: 'owner', }, }); const organization = OrganizationFixture({ access: ['org:admin'], features: ['org-roles-for-teams'], }); render(, { organization, }); // set org role const unsetDropdown = await screen.findByText('None'); await selectEvent.select(unsetDropdown, 'Owner'); await userEvent.click(screen.getByRole('button', {name: 'Save'})); expect(putMock).toHaveBeenCalledWith( `/teams/org-slug/${team.slug}/`, expect.objectContaining({ data: { orgRole: 'owner', }, }) ); // unset org role const setDropdown = await screen.findByText('Owner'); await selectEvent.select(setDropdown, 'None'); await userEvent.click(screen.getByRole('button', {name: 'Save'})); expect(putMock).toHaveBeenCalledWith( `/teams/org-slug/${team.slug}/`, expect.objectContaining({ data: { orgRole: '', }, }) ); }); it('needs team:admin in order to see an enabled Remove Team button', function () { const team = TeamFixture(); const organization = OrganizationFixture({access: []}); render(, { organization, }); expect(screen.getByTestId('button-remove-team')).toBeDisabled(); }); it('needs org:admin in order to set team org-role', function () { const team = TeamFixture(); const organization = OrganizationFixture({ access: [], features: ['org-roles-for-teams'], }); render(, { organization, }); expect(screen.getByRole('textbox', {name: 'Organization Role'})).toBeDisabled(); }); it('cannot set team org-role for idp:provisioned team', function () { const team = TeamFixture({flags: {'idp:provisioned': true}}); const organization = OrganizationFixture({ access: ['org:admin'], features: ['org-roles-for-teams'], }); render(, { organization, }); expect(screen.getByRole('textbox', {name: 'Organization Role'})).toBeDisabled(); }); it('can remove team', async function () { const team = TeamFixture({hasAccess: true}); const deleteMock = MockApiClient.addMockResponse({ url: `/teams/org-slug/${team.slug}/`, method: 'DELETE', }); TeamStore.loadInitialData([team]); render(); // Click "Remove Team button await userEvent.click(screen.getByRole('button', {name: 'Remove Team'})); // Wait for modal renderGlobalModal(); await userEvent.click(screen.getByTestId('confirm-button')); expect(deleteMock).toHaveBeenCalledWith( `/teams/org-slug/${team.slug}/`, expect.objectContaining({ method: 'DELETE', }) ); await waitFor(() => expect(browserHistory.replace).toHaveBeenCalledWith('/settings/org-slug/teams/') ); expect(TeamStore.getAll()).toEqual([]); }); });