system-messages.test.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { expect } from 'chai'
  2. import { render, screen, fireEvent } from '@testing-library/react'
  3. import fetchMock from 'fetch-mock'
  4. import SystemMessages from '@/shared/components/system-messages'
  5. describe('<SystemMessages />', function () {
  6. beforeEach(function () {
  7. fetchMock.removeRoutes().clearHistory()
  8. localStorage.clear()
  9. })
  10. afterEach(function () {
  11. fetchMock.removeRoutes().clearHistory()
  12. localStorage.clear()
  13. })
  14. it('renders non-dismissable system message', async function () {
  15. const data = {
  16. _id: 'protected',
  17. content: 'Random content',
  18. }
  19. fetchMock.get(/\/system\/messages/, [data])
  20. render(<SystemMessages />)
  21. await fetchMock.callHistory.flush(true)
  22. await screen.findByText(data.content)
  23. expect(screen.queryByRole('button', { name: /close/i })).to.be.null
  24. })
  25. it('renders and closes dismissable system message', async function () {
  26. const data = {
  27. _id: 1,
  28. content: 'Random content',
  29. }
  30. fetchMock.get(/\/system\/messages/, [data])
  31. render(<SystemMessages />)
  32. await fetchMock.callHistory.flush(true)
  33. await screen.findByText(data.content)
  34. const closeBtn = screen.getByRole('button', { name: /close/i })
  35. fireEvent.click(closeBtn)
  36. expect(screen.queryByText(data.content)).to.be.null
  37. const dismissed = localStorage.getItem(`systemMessage.hide.${data._id}`)
  38. expect(dismissed).to.equal('true')
  39. })
  40. it('renders and closes translation message', async function () {
  41. const data = {
  42. url: '/dev/null',
  43. lngName: 'German',
  44. imgUrl: 'https://flagcdn.com/w40/de.png',
  45. }
  46. const currentUrl = '/project'
  47. fetchMock.get(/\/system\/messages/, [])
  48. window.metaAttributesCache.set('ol-suggestedLanguage', data)
  49. window.metaAttributesCache.set('ol-currentUrl', currentUrl)
  50. render(<SystemMessages />)
  51. await fetchMock.callHistory.flush(true)
  52. const link = screen.getByRole('link', { name: /click here/i })
  53. expect(link.getAttribute('href')).to.equal(`${data.url}${currentUrl}`)
  54. const flag = screen.getByRole('img', { hidden: true })
  55. expect(flag.getAttribute('src')).to.equal(data.imgUrl)
  56. const closeBtn = screen.getByRole('button', { name: /close/i })
  57. fireEvent.click(closeBtn)
  58. expect(
  59. screen.queryByRole('link', {
  60. name: `Click here to use Overleaf in ${data.lngName}`,
  61. })
  62. ).to.be.null
  63. expect(screen.queryByRole('img')).to.be.null
  64. const dismissed = localStorage.getItem('hide-i18n-notification')
  65. expect(dismissed).to.equal('true')
  66. })
  67. })