import {GitHubIntegrationConfig} from 'sentry-fixture/integrationListDirectory';
import {initializeOrg} from 'sentry-test/initializeOrg';
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', () => {
const {organization, project, routerProps} = initializeOrg();
beforeEach(() => {
MockApiClient.addMockResponse({
url: `/projects/${organization.slug}/${project.slug}/ownership/`,
method: 'GET',
body: {
fallthrough: false,
autoAssignment: 'Auto Assign to Suspect Commits',
codeownersAutoSync: false,
},
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/code-mappings/?project=${project.id}`,
method: 'GET',
body: [],
});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/integrations/?features=codeowners`,
method: 'GET',
body: [GitHubIntegrationConfig()],
});
MockApiClient.addMockResponse({
url: `/projects/${organization.slug}/${project.slug}/codeowners/`,
method: 'GET',
body: [],
});
});
afterEach(() => {
MockApiClient.clearMockResponses();
});
describe('without codeowners', () => {
it('renders', () => {
render(
);
// Does not render codeowners for orgs without 'integrations-codeowners' feature
expect(
screen.queryByRole('button', {name: 'Add CODEOWNERS'})
).not.toBeInTheDocument();
});
it('renders allows users to edit ownership rules', () => {
render(
,
{organization: TestStubs.Organization({access: ['project:read']})}
);
expect(screen.queryByRole('button', {name: 'Edit'})).toBeEnabled();
expect(screen.getByTestId('project-permission-alert')).toBeInTheDocument();
// eslint-disable-next-line jest-dom/prefer-in-document
expect(screen.getAllByTestId('project-permission-alert')).toHaveLength(1);
});
});
describe('with codeowners', () => {
it('codeowners button opens modal', async () => {
const org = TestStubs.Organization({
features: ['integrations-codeowners'],
access: ['org:integrations'],
});
render(
,
{context: TestStubs.routerContext([{organization: org}])}
);
// Renders button
expect(screen.getByRole('button', {name: 'Import CODEOWNERS'})).toBeInTheDocument();
// Opens modal
await userEvent.click(screen.getByRole('button', {name: 'Import CODEOWNERS'}));
expect(openModal).toHaveBeenCalled();
});
});
describe('issue owners settings', () => {
it('should set autoAssignment with commit-context string', async () => {
const updateOwnership = MockApiClient.addMockResponse({
url: `/projects/${organization.slug}/${project.slug}/ownership/`,
method: 'PUT',
body: {
fallthrough: false,
autoAssignment: 'Assign To Issue Owner',
codeownersAutoSync: false,
},
});
render(
);
// Switch to Assign To Issue Owner
await userEvent.click(screen.getByText('Auto-assign to suspect commits'));
await 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',
},
})
);
});
});
it('should hide issue owners for issue-alert-fallback-targeting flag', () => {
const org = {
...organization,
features: ['issue-alert-fallback-targeting'],
};
render(
);
expect(screen.getByText('Prioritize Auto Assignment')).toBeInTheDocument();
expect(
screen.queryByText('Send alert to project members if there’s no assigned owner')
).not.toBeInTheDocument();
});
});
});