modal.test.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import sinon from 'sinon'
  2. import { fireEvent, screen, render, waitFor } from '@testing-library/react'
  3. import fetchMock from 'fetch-mock'
  4. import LeaveModal from '../../../../../../frontend/js/features/settings/components/leave/modal'
  5. import getMeta from '@/utils/meta'
  6. describe('<LeaveModal />', function () {
  7. beforeEach(function () {
  8. window.metaAttributesCache.set('ol-usersEmail', 'foo@bar.com')
  9. Object.assign(getMeta('ol-ExposedSettings'), { isOverleaf: true })
  10. window.metaAttributesCache.set('ol-hasPassword', true)
  11. })
  12. afterEach(function () {
  13. fetchMock.removeRoutes().clearHistory()
  14. })
  15. it('closes modal on cancel', async function () {
  16. const handleClose = sinon.stub()
  17. render(<LeaveModal isOpen handleClose={handleClose} />)
  18. const cancelButton = screen.getByRole('button', {
  19. name: 'Cancel',
  20. })
  21. fireEvent.click(cancelButton)
  22. sinon.assert.calledOnce(handleClose)
  23. })
  24. it('does not close modal while in flight', async function () {
  25. fetchMock.post('/user/delete', new Promise(() => {}))
  26. const handleClose = sinon.stub()
  27. render(<LeaveModal isOpen handleClose={handleClose} />)
  28. fillValidForm()
  29. const deleteButton = screen.getByRole('button', {
  30. name: 'Delete',
  31. })
  32. fireEvent.click(deleteButton)
  33. await waitFor(() => {
  34. screen.getByRole('button', {
  35. name: 'Deleting…',
  36. })
  37. })
  38. const cancelButton = screen.getByRole('button', {
  39. name: 'Cancel',
  40. })
  41. fireEvent.click(cancelButton)
  42. sinon.assert.notCalled(handleClose)
  43. })
  44. })
  45. function fillValidForm() {
  46. fireEvent.change(screen.getByLabelText('Email'), {
  47. target: { value: 'foo@bar.com' },
  48. })
  49. fireEvent.change(screen.getByLabelText('Password'), {
  50. target: { value: 'foobar' },
  51. })
  52. fireEvent.click(screen.getByLabelText(/I understand/))
  53. }