message-list.test.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import sinon from 'sinon'
  2. import { expect } from 'chai'
  3. import { screen, render, fireEvent } from '@testing-library/react'
  4. import MessageList from '../../../../../frontend/js/features/chat/components/message-list'
  5. import { stubMathJax, tearDownMathJaxStubs } from './stubs'
  6. import { UserProvider } from '@/shared/context/user-context'
  7. describe('<MessageList />', function () {
  8. const currentUser = {
  9. id: 'fake_user',
  10. first_name: 'fake_user_first_name',
  11. email: 'fake@example.com',
  12. }
  13. function createMessages() {
  14. return [
  15. {
  16. id: '1',
  17. contents: ['a message'],
  18. user: currentUser,
  19. timestamp: new Date().getTime(),
  20. },
  21. {
  22. id: '2',
  23. contents: ['another message'],
  24. user: currentUser,
  25. timestamp: new Date().getTime(),
  26. },
  27. ]
  28. }
  29. before(function () {
  30. stubMathJax()
  31. })
  32. after(function () {
  33. tearDownMathJaxStubs()
  34. })
  35. let olUser
  36. beforeEach(function () {
  37. olUser = window.metaAttributesCache.get('ol-user')
  38. window.metaAttributesCache.set('ol-user', currentUser)
  39. })
  40. afterEach(function () {
  41. window.metaAttributesCache.set('ol-user', olUser)
  42. })
  43. it('renders multiple messages', function () {
  44. render(
  45. <UserProvider>
  46. <MessageList
  47. userId={currentUser.id}
  48. messages={createMessages()}
  49. resetUnreadMessages={() => {}}
  50. />
  51. </UserProvider>
  52. )
  53. screen.getByText('a message')
  54. screen.getByText('another message')
  55. })
  56. it('renders a single timestamp for all messages within 5 minutes', function () {
  57. const msgs = createMessages()
  58. msgs[0].timestamp = new Date(2019, 6, 3, 4, 23).getTime()
  59. msgs[1].timestamp = new Date(2019, 6, 3, 4, 27).getTime()
  60. render(
  61. <UserProvider>
  62. <MessageList
  63. userId={currentUser.id}
  64. messages={msgs}
  65. resetUnreadMessages={() => {}}
  66. />
  67. </UserProvider>
  68. )
  69. screen.getByText('4:23 am Wed, 3rd Jul 19')
  70. expect(screen.queryByText('4:27 am Wed, 3rd Jul 19')).to.not.exist
  71. })
  72. it('renders a timestamp for each messages separated for more than 5 minutes', function () {
  73. const msgs = createMessages()
  74. msgs[0].timestamp = new Date(2019, 6, 3, 4, 23).getTime()
  75. msgs[1].timestamp = new Date(2019, 6, 3, 4, 31).getTime()
  76. render(
  77. <UserProvider>
  78. <MessageList
  79. userId={currentUser.id}
  80. messages={msgs}
  81. resetUnreadMessages={() => {}}
  82. />
  83. </UserProvider>
  84. )
  85. screen.getByText('4:23 am Wed, 3rd Jul 19')
  86. screen.getByText('4:31 am Wed, 3rd Jul 19')
  87. })
  88. it('resets the number of unread messages after clicking on the input', function () {
  89. const resetUnreadMessages = sinon.stub()
  90. render(
  91. <UserProvider>
  92. <MessageList
  93. userId={currentUser.id}
  94. messages={createMessages()}
  95. resetUnreadMessages={resetUnreadMessages}
  96. />
  97. </UserProvider>
  98. )
  99. fireEvent.click(screen.getByRole('list'))
  100. expect(resetUnreadMessages).to.be.calledOnce
  101. })
  102. })