ownershipInput.spec.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import {selectByValueAsync} from 'sentry-test/select-new';
  3. import MemberListStore from 'sentry/stores/memberListStore';
  4. import OwnerInput from 'sentry/views/settings/project/projectOwnership/ownerInput';
  5. describe('Project Ownership Input', function () {
  6. let org;
  7. let project;
  8. let put;
  9. beforeEach(function () {
  10. org = TestStubs.Organization();
  11. project = TestStubs.Project();
  12. MockApiClient.addMockResponse({
  13. url: '/organizations/org-slug/members/',
  14. method: 'GET',
  15. body: TestStubs.Members(),
  16. });
  17. put = MockApiClient.addMockResponse({
  18. url: `/projects/${org.slug}/${project.slug}/ownership/`,
  19. method: 'PUT',
  20. body: {raw: 'url:src @dummy@example.com'},
  21. });
  22. MemberListStore.loadInitialData([
  23. TestStubs.User({id: '1', email: 'bob@example.com'}),
  24. ]);
  25. });
  26. afterEach(function () {
  27. MemberListStore.init();
  28. });
  29. it('renders', function () {
  30. const wrapper = mountWithTheme(
  31. <OwnerInput
  32. params={{orgId: org.slug, projectId: project.slug}}
  33. organization={org}
  34. initialText="url:src @dummy@example.com"
  35. project={project}
  36. />,
  37. TestStubs.routerContext()
  38. );
  39. const submit = wrapper.find('SaveButton button');
  40. expect(put).not.toHaveBeenCalled();
  41. // if text is unchanged, submit button is disabled
  42. submit.simulate('click');
  43. expect(put).not.toHaveBeenCalled();
  44. wrapper.find('StyledTextArea').simulate('change', {target: {value: 'new'}});
  45. submit.simulate('click');
  46. expect(put).toHaveBeenCalled();
  47. expect(wrapper.find(OwnerInput)).toSnapshot();
  48. });
  49. it('updates on add preserving existing text', async function () {
  50. const wrapper = mountWithTheme(
  51. <OwnerInput
  52. params={{orgId: org.slug, projectId: project.slug}}
  53. organization={org}
  54. initialText="url:src @dummy@example.com"
  55. project={project}
  56. />,
  57. TestStubs.routerContext()
  58. );
  59. // Set a path, as path is selected bu default.
  60. const pathInput = wrapper.find('RuleBuilder BuilderInput');
  61. pathInput.simulate('change', {target: {value: 'file.js'}});
  62. // Select the user.
  63. await selectByValueAsync(wrapper, 'user:1', {control: true, name: 'owners'});
  64. await wrapper.update();
  65. // Add the new rule.
  66. const button = wrapper.find('RuleBuilder AddButton button');
  67. button.simulate('click');
  68. await wrapper.update();
  69. expect(put).toHaveBeenCalledWith(
  70. '/projects/org-slug/project-slug/ownership/',
  71. expect.objectContaining({
  72. data: {
  73. raw: 'url:src @dummy@example.com' + '\n' + 'path:file.js bob@example.com',
  74. },
  75. })
  76. );
  77. });
  78. });