import {mountWithTheme} from 'sentry-test/enzyme';
import {selectByValue} from 'sentry-test/select-new';
import {Client} from 'sentry/api';
import {AddCodeOwnerModal} from 'sentry/views/settings/project/projectOwnership/addCodeOwnerModal';
describe('AddCodeOwnerModal', function () {
const modalProps = {
Body: p => p.children,
Header: p => p.children,
Footer: p => p.children,
closeModal: jest.fn(() => null),
};
const org = TestStubs.Organization({features: ['integrations-codeowners']});
const project = TestStubs.ProjectDetails();
const integration = TestStubs.GitHubIntegration();
const repo = TestStubs.Repository({
integrationId: integration.id,
id: '5',
name: 'example/hello-there',
});
const codeMapping = TestStubs.RepositoryProjectPathConfig(project, repo, integration, {
stackRoot: 'stack/root',
sourceRoot: 'source/root',
});
beforeEach(function () {
Client.clearMockResponses();
Client.addMockResponse({
url: `/organizations/${org.slug}/code-mappings/`,
method: 'GET',
query: {project: '2'},
body: [codeMapping],
});
Client.addMockResponse({
url: `/organizations/${org.slug}/integrations/`,
method: 'GET',
query: {features: ['codeowners']},
body: [integration],
});
});
it('renders', function () {
const wrapper = mountWithTheme(
);
expect(wrapper.find('Button').prop('disabled')).toBe(true);
});
it('renders codeowner file', async function () {
Client.addMockResponse({
url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
method: 'GET',
body: {html_url: 'blah', filepath: 'CODEOWNERS', raw: '* @MeredithAnya\n'},
});
const wrapper = mountWithTheme(
);
selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
await tick();
wrapper.update();
expect(wrapper.find('IconCheckmark').exists()).toBe(true);
expect(wrapper.find('SourceFileBody').find('Button').prop('href')).toEqual('blah');
expect(wrapper.find('SourceFileBody').text()).toContain('CODEOWNERS');
expect(wrapper.state('codeownersFile').raw).toEqual('* @MeredithAnya\n');
});
it('renders no codeowner file found', async function () {
Client.addMockResponse({
url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
method: 'GET',
statusCode: 404,
});
const wrapper = mountWithTheme(
);
selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
await tick();
wrapper.update();
expect(wrapper.find('IconNot').exists()).toBe(true);
expect(wrapper.find('NoSourceFileBody').text()).toEqual('No codeowner file found.');
expect(wrapper.state('codeownersFile')).toBe(null);
});
it('adds codeowner file', async function () {
Client.addMockResponse({
url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
method: 'GET',
body: {html_url: 'blah', filepath: 'CODEOWNERS', raw: '* @MeredithAnya\n'},
});
const addFileRequest = Client.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/codeowners/`,
method: 'POST',
body: {},
});
const wrapper = mountWithTheme(
);
selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
await tick();
wrapper.update();
wrapper.find('Footer').find('Button').simulate('click');
await tick();
wrapper.update();
expect(addFileRequest).toHaveBeenCalledWith(
`/projects/${org.slug}/${project.slug}/codeowners/`,
expect.objectContaining({
data: {raw: '* @MeredithAnya\n', codeMappingId: codeMapping.id},
})
);
const closeModal = wrapper.prop('closeModal');
expect(closeModal).toHaveBeenCalled();
});
});