message-list.test.tsx 3.0 KB

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