message-list.test.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import React from 'react'
  2. import sinon from 'sinon'
  3. import { expect } from 'chai'
  4. import { screen, render, fireEvent } from '@testing-library/react'
  5. import MessageList from '../../../../../frontend/js/features/chat/components/message-list'
  6. import {
  7. stubChatStore,
  8. stubMathJax,
  9. stubUIConfig,
  10. tearDownChatStore,
  11. tearDownMathJaxStubs,
  12. tearDownUIConfigStubs
  13. } from './stubs'
  14. describe('<MessageList />', function() {
  15. const currentUser = {
  16. id: 'fake_user',
  17. first_name: 'fake_user_first_name',
  18. email: 'fake@example.com'
  19. }
  20. function createMessages() {
  21. return [
  22. {
  23. contents: ['a message'],
  24. user: currentUser,
  25. timestamp: new Date().getTime()
  26. },
  27. {
  28. contents: ['another message'],
  29. user: currentUser,
  30. timestamp: new Date().getTime()
  31. }
  32. ]
  33. }
  34. before(function() {
  35. stubChatStore({ user: currentUser }) // required by ColorManager
  36. stubUIConfig()
  37. stubMathJax()
  38. })
  39. after(function() {
  40. tearDownChatStore()
  41. tearDownUIConfigStubs()
  42. tearDownMathJaxStubs()
  43. })
  44. it('renders multiple messages', function() {
  45. render(
  46. <MessageList
  47. userId={currentUser.id}
  48. messages={createMessages()}
  49. resetUnreadMessages={() => {}}
  50. />
  51. )
  52. screen.getByText('a message')
  53. screen.getByText('another message')
  54. })
  55. it('renders a single timestamp for all messages within 5 minutes', function() {
  56. const msgs = createMessages()
  57. msgs[0].timestamp = new Date(2019, 6, 3, 4, 23).getTime()
  58. msgs[1].timestamp = new Date(2019, 6, 3, 4, 27).getTime()
  59. render(
  60. <MessageList
  61. userId={currentUser.id}
  62. messages={msgs}
  63. resetUnreadMessages={() => {}}
  64. />
  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. <MessageList
  75. userId={currentUser.id}
  76. messages={msgs}
  77. resetUnreadMessages={() => {}}
  78. />
  79. )
  80. screen.getByText('4:23 am Wed, 3rd Jul 19')
  81. screen.getByText('4:31 am Wed, 3rd Jul 19')
  82. })
  83. it('resets the number of unread messages after clicking on the input', function() {
  84. const resetUnreadMessages = sinon.stub()
  85. render(
  86. <MessageList
  87. userId={currentUser.id}
  88. messages={createMessages()}
  89. resetUnreadMessages={resetUnreadMessages}
  90. />
  91. )
  92. fireEvent.click(screen.getByRole('list'))
  93. expect(resetUnreadMessages).to.be.calledOnce
  94. })
  95. })