emails-section-actions.test.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import {
  2. render,
  3. screen,
  4. waitForElementToBeRemoved,
  5. fireEvent,
  6. } from '@testing-library/react'
  7. import { expect } from 'chai'
  8. import { UserEmailData } from '../../../../../../types/user-email'
  9. import fetchMock from 'fetch-mock'
  10. import EmailsSection from '../../../../../../frontend/js/features/settings/components/emails-section'
  11. const userEmailData: UserEmailData = {
  12. confirmedAt: '2022-03-10T10:59:44.139Z',
  13. email: 'bar@overleaf.com',
  14. default: false,
  15. }
  16. describe('email actions - make primary', function () {
  17. beforeEach(function () {
  18. window.metaAttributesCache.set('ol-ExposedSettings', {
  19. hasAffiliationsFeature: true,
  20. })
  21. fetchMock.reset()
  22. })
  23. afterEach(function () {
  24. window.metaAttributesCache = new Map()
  25. fetchMock.reset()
  26. })
  27. it('shows loader when making email primary and removes button', async function () {
  28. fetchMock
  29. .get('/user/emails?ensureAffiliation=true', [userEmailData])
  30. .post('/user/emails/default', 200)
  31. const userEmailDataCopy = { ...userEmailData }
  32. render(<EmailsSection />)
  33. const button = await screen.findByRole('button', { name: /make primary/i })
  34. fireEvent.click(button)
  35. expect(screen.queryByRole('button', { name: /make primary/i })).to.be.null
  36. userEmailDataCopy.default = true
  37. await waitForElementToBeRemoved(() =>
  38. screen.getByRole('button', { name: /sending/i })
  39. )
  40. expect(
  41. screen.queryByText(/an error has occurred while performing your request/i)
  42. ).to.be.null
  43. expect(screen.queryByRole('button', { name: /make primary/i })).to.be.null
  44. })
  45. it('shows error when making email primary', async function () {
  46. fetchMock
  47. .get('/user/emails?ensureAffiliation=true', [userEmailData])
  48. .post('/user/emails/default', 503)
  49. render(<EmailsSection />)
  50. const button = await screen.findByRole('button', { name: /make primary/i })
  51. fireEvent.click(button)
  52. await waitForElementToBeRemoved(() =>
  53. screen.getByRole('button', { name: /sending/i })
  54. )
  55. screen.getByText(/an error has occurred while performing your request/i)
  56. screen.getByRole('button', { name: /make primary/i })
  57. })
  58. })
  59. describe('email actions - delete', function () {
  60. beforeEach(function () {
  61. window.metaAttributesCache.set('ol-ExposedSettings', {
  62. hasAffiliationsFeature: true,
  63. })
  64. fetchMock.reset()
  65. })
  66. afterEach(function () {
  67. window.metaAttributesCache = new Map()
  68. fetchMock.reset()
  69. })
  70. it('shows loader when deleting and removes the row', async function () {
  71. fetchMock
  72. .get('/user/emails?ensureAffiliation=true', [userEmailData])
  73. .post('/user/emails/delete', 200)
  74. render(<EmailsSection />)
  75. const button = await screen.findByRole('button', { name: /remove/i })
  76. fireEvent.click(button)
  77. expect(screen.queryByRole('button', { name: /remove/i })).to.be.null
  78. await waitForElementToBeRemoved(() =>
  79. screen.getByRole('button', { name: /deleting/i })
  80. )
  81. expect(screen.queryByText(userEmailData.email)).to.be.null
  82. })
  83. it('shows error when making email primary', async function () {
  84. fetchMock
  85. .get('/user/emails?ensureAffiliation=true', [userEmailData])
  86. .post('/user/emails/delete', 503)
  87. render(<EmailsSection />)
  88. const button = await screen.findByRole('button', { name: /remove/i })
  89. fireEvent.click(button)
  90. await waitForElementToBeRemoved(() =>
  91. screen.getByRole('button', { name: /deleting/i })
  92. )
  93. screen.getByText(/an error has occurred while performing your request/i)
  94. screen.getByRole('button', { name: /remove/i })
  95. })
  96. })