import React from 'react';
import {mountWithTheme} from 'sentry-test/enzyme';
import {findOption, openMenu} from 'sentry-test/select';
import MemberListStore from 'app/stores/memberListStore';
import OwnerInput from 'app/views/settings/project/projectOwnership/ownerInput';
describe('Project Ownership Input', function () {
let org;
let project;
let put;
beforeEach(function () {
org = TestStubs.Organization();
project = TestStubs.Project();
MockApiClient.addMockResponse({
url: '/organizations/org-slug/members/',
method: 'GET',
body: TestStubs.Members(),
});
put = MockApiClient.addMockResponse({
url: `/projects/${org.slug}/${project.slug}/ownership/`,
method: 'PUT',
body: {raw: 'url:src @dummy@example.com'},
});
MemberListStore.loadInitialData([
TestStubs.User({id: '1', email: 'bob@example.com'}),
]);
});
afterEach(function () {
MemberListStore.init();
});
it('renders', function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
const submit = wrapper.find('SaveButton button');
expect(put).not.toHaveBeenCalled();
// if text is unchanged, submit button is disabled
submit.simulate('click');
expect(put).not.toHaveBeenCalled();
wrapper.find('StyledTextArea').simulate('change', {target: {value: 'new'}});
submit.simulate('click');
expect(put).toHaveBeenCalled();
expect(wrapper.find(OwnerInput)).toSnapshot();
});
it('updates on add preserving existing text', async function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
// Set a path, as path is selected bu default.
const pathInput = wrapper.find('RuleBuilder BuilderInput');
pathInput.simulate('change', {target: {value: 'file.js'}});
// Select the user.
let userSelect = wrapper.find('RuleBuilder SelectOwners');
openMenu(userSelect, {control: true});
await tick();
await wrapper.update();
// Because this menu is async we can't use selectByValue()
userSelect = wrapper.find('RuleBuilder SelectOwners');
findOption(userSelect, {value: 'user:1'}, {control: true})
.at(0)
.simulate('mouseDown');
await wrapper.update();
// Add the new rule.
const button = wrapper.find('RuleBuilder AddButton button');
button.simulate('click');
expect(put).toHaveBeenCalledWith(
'/projects/org-slug/project-slug/ownership/',
expect.objectContaining({
data: {
raw: 'url:src @dummy@example.com' + '\n' + 'path:file.js bob@example.com',
},
})
);
});
});