ruleBuilder.spec.jsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import MemberListStore from 'app/stores/memberListStore';
  4. import TeamStore from 'app/stores/teamStore';
  5. import ProjectsStore from 'app/stores/projectsStore';
  6. import RuleBuilder from 'app/views/settings/project/projectOwnership/ruleBuilder';
  7. jest.mock('jquery');
  8. describe('RuleBuilder', function() {
  9. let sandbox;
  10. let organization = TestStubs.Organization();
  11. let project;
  12. let handleAdd;
  13. let USER_1 = TestStubs.User({
  14. id: '1',
  15. name: 'Jane Doe',
  16. email: 'janedoe@example.com',
  17. user: {
  18. id: '1',
  19. name: 'Jane Doe',
  20. email: 'janedoe@example.com',
  21. },
  22. });
  23. let USER_2 = TestStubs.User({
  24. id: '2',
  25. name: 'John Smith',
  26. email: 'johnsmith@example.com',
  27. user: {
  28. id: '2',
  29. name: 'John Smith',
  30. email: 'johnsmith@example.com',
  31. },
  32. });
  33. let TEAM_1 = TestStubs.Team({
  34. id: '3',
  35. name: 'COOL TEAM',
  36. slug: 'cool-team',
  37. });
  38. // This team is in project
  39. let TEAM_2 = TestStubs.Team({
  40. id: '4',
  41. name: 'TEAM NOT IN PROJECT',
  42. slug: 'team-not-in-project',
  43. });
  44. beforeEach(function() {
  45. sandbox = sinon.sandbox.create();
  46. // User in project
  47. MemberListStore.loadInitialData([USER_1]);
  48. // All teams
  49. sandbox.stub(TeamStore, 'getAll').returns([TEAM_1, TEAM_2]);
  50. handleAdd = jest.fn();
  51. project = TestStubs.Project({
  52. // Teams in project
  53. teams: [TEAM_1],
  54. });
  55. ProjectsStore.loadInitialData([project]);
  56. sandbox.stub(ProjectsStore, 'getBySlug').returns(project);
  57. MockApiClient.clearMockResponses();
  58. MockApiClient.addMockResponse({
  59. url: '/organizations/org-slug/members/',
  60. body: [USER_1, USER_2],
  61. });
  62. });
  63. afterEach(function() {
  64. sandbox.restore();
  65. });
  66. it('renders', async function() {
  67. let wrapper = mount(
  68. <RuleBuilder project={project} organization={organization} onAddRule={handleAdd} />,
  69. TestStubs.routerContext()
  70. );
  71. await tick();
  72. wrapper.update();
  73. let add = wrapper.find('Button');
  74. add.simulate('click');
  75. expect(handleAdd).not.toHaveBeenCalled();
  76. let text = wrapper.find('BuilderInput');
  77. text.simulate('change', {target: {value: 'some/path/*'}});
  78. expect(wrapper.find('Button').prop('disabled')).toBe(true);
  79. add.simulate('click');
  80. expect(handleAdd).not.toHaveBeenCalled();
  81. // Simulate select first element via down arrow / enter
  82. wrapper.find('SelectOwners .Select-control').simulate('keyDown', {keyCode: 40});
  83. wrapper.find('SelectOwners .Select-control').simulate('keyDown', {keyCode: 13});
  84. expect(wrapper.find('Button').prop('disabled')).toBe(false);
  85. add.simulate('click');
  86. expect(handleAdd).toHaveBeenCalled();
  87. // This is because after selecting, react-select (async) reloads
  88. await tick();
  89. wrapper.update();
  90. expect(wrapper.find(RuleBuilder)).toMatchSnapshot();
  91. });
  92. it('renders with suggestions', async function() {
  93. let wrapper = mount(
  94. <RuleBuilder
  95. project={project}
  96. organization={organization}
  97. onAddRule={handleAdd}
  98. urls={['example.com/a', 'example.com/a/foo']}
  99. paths={['a/bar', 'a/foo']}
  100. />,
  101. TestStubs.routerContext()
  102. );
  103. wrapper.find('SelectOwners .Select-input input').simulate('focus');
  104. await tick();
  105. wrapper.update();
  106. // Simulate select first element via down arrow / enter
  107. wrapper.find('SelectOwners .Select-control').simulate('keyDown', {keyCode: 40});
  108. // Should have all 4 users/teams listed
  109. expect(wrapper.find('IdBadge')).toHaveLength(4);
  110. // Should have 1 user not in project and 1 team not in project
  111. expect(wrapper.find('DisabledLabel IdBadge')).toHaveLength(2);
  112. // Team not in project should not be selectable
  113. expect(
  114. wrapper
  115. .find('DisabledLabel IdBadge')
  116. .at(0)
  117. .prop('team').id
  118. ).toBe('4');
  119. // John Smith should not be selectable
  120. expect(
  121. wrapper
  122. .find('DisabledLabel IdBadge')
  123. .at(1)
  124. .prop('user').id
  125. ).toBe('2');
  126. // Enter to select Jane Doe
  127. wrapper.find('SelectOwners .Select-control').simulate('keyDown', {keyCode: 13});
  128. let ruleCandidate = wrapper.find('RuleCandidate').first();
  129. ruleCandidate.simulate('click');
  130. // This is because after selecting, react-select (async) reloads
  131. await tick();
  132. wrapper.update();
  133. expect(wrapper.find(RuleBuilder)).toMatchSnapshot();
  134. wrapper.find('Button').simulate('click');
  135. expect(handleAdd).toHaveBeenCalled();
  136. });
  137. });