inviteRequestRow.spec.jsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import {mountGlobalModal} from 'sentry-test/modal';
  3. import {act} from 'sentry-test/reactTestingLibrary';
  4. import {selectByValue} from 'sentry-test/select-new';
  5. import TeamStore from 'sentry/stores/teamStore';
  6. import InviteRequestRow from 'sentry/views/settings/organizationMembers/inviteRequestRow';
  7. const roles = [
  8. {
  9. id: 'admin',
  10. name: 'Admin',
  11. desc: 'This is the admin role',
  12. allowed: true,
  13. },
  14. {
  15. id: 'member',
  16. name: 'Member',
  17. desc: 'This is the member role',
  18. allowed: true,
  19. },
  20. {
  21. id: 'owner',
  22. name: 'Owner',
  23. desc: 'This is the owner role',
  24. allowed: false,
  25. },
  26. ];
  27. describe('InviteRequestRow', function () {
  28. const orgId = 'org-slug';
  29. const orgWithoutAdminAccess = TestStubs.Organization({
  30. access: [],
  31. });
  32. const orgWithAdminAccess = TestStubs.Organization({
  33. access: ['member:admin'],
  34. });
  35. const inviteRequestBusy = new Map();
  36. const inviteRequest = TestStubs.Member({
  37. user: null,
  38. inviterName: TestStubs.User().name,
  39. inviterId: TestStubs.User().id,
  40. inviteStatus: 'requested_to_be_invited',
  41. role: 'member',
  42. teams: ['myteam'],
  43. });
  44. const joinRequest = TestStubs.Member({
  45. user: null,
  46. inviteStatus: 'requested_to_join',
  47. role: 'member',
  48. teams: ['myteam'],
  49. });
  50. it('renders request to be invited', function () {
  51. const wrapper = mountWithTheme(
  52. <InviteRequestRow
  53. orgId={orgId}
  54. organization={orgWithoutAdminAccess}
  55. inviteRequest={inviteRequest}
  56. inviteRequestBusy={inviteRequestBusy}
  57. allRoles={roles}
  58. />
  59. );
  60. expect(wrapper.find('UserName').text()).toBe(inviteRequest.email);
  61. expect(wrapper.find('Description').text().includes(inviteRequest.inviterName)).toBe(
  62. true
  63. );
  64. });
  65. it('renders request to join', function () {
  66. const wrapper = mountWithTheme(
  67. <InviteRequestRow
  68. orgId={orgId}
  69. organization={orgWithoutAdminAccess}
  70. inviteRequest={joinRequest}
  71. inviteRequestBusy={inviteRequestBusy}
  72. allRoles={roles}
  73. />
  74. );
  75. expect(wrapper.find('UserName').text()).toBe(joinRequest.email);
  76. expect(wrapper.find('JoinRequestIndicator').exists()).toBe(true);
  77. });
  78. it('admin can approve invite request', async function () {
  79. const mockApprove = jest.fn();
  80. const mockDeny = jest.fn();
  81. const wrapper = mountWithTheme(
  82. <InviteRequestRow
  83. orgId={orgId}
  84. organization={orgWithAdminAccess}
  85. inviteRequest={inviteRequest}
  86. inviteRequestBusy={inviteRequestBusy}
  87. onApprove={mockApprove}
  88. onDeny={mockDeny}
  89. allRoles={roles}
  90. />
  91. );
  92. wrapper.find('button[aria-label="Approve"]').simulate('click');
  93. const modal = await mountGlobalModal();
  94. modal.find('button[aria-label="Confirm"]').simulate('click');
  95. expect(mockApprove).toHaveBeenCalledWith(inviteRequest);
  96. expect(mockDeny).not.toHaveBeenCalled();
  97. });
  98. it('admin can deny invite request', function () {
  99. const mockApprove = jest.fn();
  100. const mockDeny = jest.fn();
  101. const wrapper = mountWithTheme(
  102. <InviteRequestRow
  103. orgId={orgId}
  104. organization={orgWithAdminAccess}
  105. inviteRequest={inviteRequest}
  106. inviteRequestBusy={inviteRequestBusy}
  107. onApprove={mockApprove}
  108. onDeny={mockDeny}
  109. allRoles={roles}
  110. />
  111. );
  112. wrapper.find('button[aria-label="Deny"]').simulate('click');
  113. expect(mockDeny).toHaveBeenCalledWith(inviteRequest);
  114. expect(mockApprove).not.toHaveBeenCalled();
  115. });
  116. it('non-admin can not approve or deny invite request', function () {
  117. const wrapper = mountWithTheme(
  118. <InviteRequestRow
  119. orgId={orgId}
  120. organization={orgWithoutAdminAccess}
  121. inviteRequest={inviteRequest}
  122. inviteRequestBusy={inviteRequestBusy}
  123. onApprove={() => {}}
  124. onDeny={() => {}}
  125. allRoles={roles}
  126. />
  127. );
  128. expect(wrapper.find('button[aria-label="Deny"]').prop('aria-disabled')).toBe(true);
  129. expect(wrapper.find('button[aria-label="Approve"]').prop('aria-disabled')).toBe(true);
  130. });
  131. it('admin can change role and teams', function () {
  132. const adminInviteRequest = TestStubs.Member({
  133. user: null,
  134. inviterName: TestStubs.User().name,
  135. inviterId: TestStubs.User().id,
  136. inviteStatus: 'requested_to_be_invited',
  137. role: 'admin',
  138. teams: ['myteam'],
  139. });
  140. act(
  141. () =>
  142. void TeamStore.loadInitialData([
  143. {id: '1', slug: 'one'},
  144. {id: '2', slug: 'two'},
  145. ])
  146. );
  147. const mockUpdate = jest.fn();
  148. const wrapper = mountWithTheme(
  149. <InviteRequestRow
  150. orgId={orgId}
  151. organization={orgWithAdminAccess}
  152. inviteRequest={adminInviteRequest}
  153. inviteRequestBusy={inviteRequestBusy}
  154. allRoles={roles}
  155. onUpdate={mockUpdate}
  156. />
  157. );
  158. selectByValue(wrapper, 'member', {name: 'role', control: true});
  159. expect(mockUpdate).toHaveBeenCalledWith({role: 'member'});
  160. selectByValue(wrapper, 'one', {name: 'teams', control: true});
  161. expect(mockUpdate).toHaveBeenCalledWith({teams: ['one']});
  162. TeamStore.reset();
  163. });
  164. it('cannot be approved when invitee role is not allowed', function () {
  165. const ownerInviteRequest = TestStubs.Member({
  166. user: null,
  167. inviterName: TestStubs.User().name,
  168. inviterId: TestStubs.User().id,
  169. inviteStatus: 'requested_to_be_invited',
  170. role: 'owner',
  171. teams: ['myteam'],
  172. });
  173. const mockUpdate = jest.fn();
  174. const wrapper = mountWithTheme(
  175. <InviteRequestRow
  176. orgId={orgId}
  177. organization={orgWithoutAdminAccess}
  178. inviteRequest={ownerInviteRequest}
  179. inviteRequestBusy={inviteRequestBusy}
  180. allRoles={roles}
  181. onUpdate={mockUpdate}
  182. />
  183. );
  184. expect(wrapper.find('button[aria-label="Approve"]').props()['aria-disabled']).toBe(
  185. true
  186. );
  187. });
  188. });