system-messages.test.tsx 2.5 KB

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