inviteRequestRow.spec.tsx 6.1 KB

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