import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import {openModal} from 'sentry/actionCreators/modal'; import ProjectOwnership from 'sentry/views/settings/project/projectOwnership'; jest.mock('sentry/actionCreators/modal'); describe('Project Ownership', () => { let org = TestStubs.Organization(); const project = TestStubs.ProjectDetails(); beforeEach(() => { MockApiClient.addMockResponse({ url: `/projects/${org.slug}/${project.slug}/ownership/`, method: 'GET', body: { fallthrough: false, autoAssignment: 'Auto Assign to Suspect Commits', codeownersAutoSync: false, }, }); MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/code-mappings/`, query: {project: project.id}, method: 'GET', body: [], }); MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/integrations/`, query: {features: 'codeowners'}, method: 'GET', body: [TestStubs.GitHubIntegrationConfig()], }); MockApiClient.addMockResponse({ url: `/projects/${org.slug}/${project.slug}/codeowners/`, features: {expand: 'codeMapping'}, method: 'GET', body: [], }); }); afterEach(() => { MockApiClient.clearMockResponses(); }); describe('without codeowners', () => { it('renders', () => { const wrapper = render( ); expect(wrapper.container).toSnapshot(); // Does not render codeowners for orgs without 'integrations-codeowners' feature expect( screen.queryByRole('button', {name: 'Add CODEOWNERS'}) ).not.toBeInTheDocument(); }); }); describe('with codeowners', () => { it('codeowners button opens modal', () => { org = TestStubs.Organization({ features: ['integrations-codeowners'], access: ['org:integrations'], }); render( , {context: TestStubs.routerContext([{organization: org}])} ); // Renders button expect(screen.getByRole('button', {name: 'Add CODEOWNERS'})).toBeInTheDocument(); // Opens modal userEvent.click(screen.getByRole('button', {name: 'Add CODEOWNERS'})); expect(openModal).toHaveBeenCalled(); }); }); describe('issue owners settings', () => { it('should set autoAssignment with commit-context string', async () => { const updateOwnership = MockApiClient.addMockResponse({ url: `/projects/${org.slug}/${project.slug}/ownership/`, method: 'PUT', body: { fallthrough: false, autoAssignment: 'Assign To Issue Owner', codeownersAutoSync: false, }, }); render( ); // Switch to Assign To Issue Owner userEvent.click(screen.getByText('Auto-assign to suspect commits')); userEvent.click(screen.getByText('Auto-assign to issue owner')); await waitFor(() => { expect(updateOwnership).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ data: { autoAssignment: 'Auto Assign to Issue Owner', }, }) ); }); }); }); });