organizationJoinRequest.spec.jsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {Organization} from 'fixtures/js-stubs/organization';
  2. import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
  3. import {addErrorMessage} from 'sentry/actionCreators/indicator';
  4. import {trackAdhocEvent} from 'sentry/utils/analytics';
  5. import OrganizationJoinRequest from 'sentry/views/organizationJoinRequest';
  6. jest.mock('sentry/utils/analytics', () => ({
  7. trackAdhocEvent: jest.fn(),
  8. }));
  9. jest.mock('sentry/actionCreators/indicator');
  10. describe('OrganizationJoinRequest', function () {
  11. const org = Organization({slug: 'test-org'});
  12. const endpoint = `/organizations/${org.slug}/join-request/`;
  13. beforeEach(function () {
  14. trackAdhocEvent.mockClear();
  15. MockApiClient.clearMockResponses();
  16. });
  17. it('renders', function () {
  18. render(<OrganizationJoinRequest params={{orgId: org.slug}} />);
  19. expect(screen.getByRole('heading', {name: 'Request to Join'})).toBeInTheDocument();
  20. expect(screen.getByRole('textbox', {name: 'Email Address'})).toBeInTheDocument();
  21. expect(screen.getByRole('button', {name: 'Request to Join'})).toBeInTheDocument();
  22. expect(trackAdhocEvent).toHaveBeenCalledWith({
  23. eventKey: 'join_request.viewed',
  24. org_slug: org.slug,
  25. });
  26. });
  27. it('submits', async function () {
  28. const postMock = MockApiClient.addMockResponse({
  29. url: endpoint,
  30. method: 'POST',
  31. });
  32. render(<OrganizationJoinRequest params={{orgId: org.slug}} />);
  33. userEvent.type(
  34. screen.getByRole('textbox', {name: 'Email Address'}),
  35. 'email@example.com{enter}'
  36. );
  37. expect(postMock).toHaveBeenCalled();
  38. expect(
  39. await screen.findByRole('heading', {name: 'Request Sent'})
  40. ).toBeInTheDocument();
  41. expect(
  42. screen.queryByRole('button', {name: 'Request to Join'})
  43. ).not.toBeInTheDocument();
  44. });
  45. it('errors', async function () {
  46. const postMock = MockApiClient.addMockResponse({
  47. url: endpoint,
  48. method: 'POST',
  49. statusCode: 400,
  50. });
  51. render(<OrganizationJoinRequest params={{orgId: org.slug}} />);
  52. userEvent.type(
  53. screen.getByRole('textbox', {name: 'Email Address'}),
  54. 'email@example.com{enter}'
  55. );
  56. await waitFor(() => {
  57. expect(postMock).toHaveBeenCalled();
  58. expect(addErrorMessage).toHaveBeenCalled();
  59. });
  60. expect(screen.getByRole('heading', {name: 'Request to Join'})).toBeInTheDocument();
  61. });
  62. it('cancels', function () {
  63. const spy = jest.spyOn(window.location, 'assign').mockImplementation(() => {});
  64. render(<OrganizationJoinRequest params={{orgId: org.slug}} />);
  65. userEvent.click(screen.getByRole('button', {name: 'Cancel'}));
  66. expect(spy).toHaveBeenCalledWith(`/auth/login/${org.slug}/`);
  67. });
  68. });