message-list.test.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. stubMathJax,
  8. stubUIConfig,
  9. tearDownMathJaxStubs,
  10. tearDownUIConfigStubs
  11. } from './stubs'
  12. describe('<MessageList />', function() {
  13. const currentUser = {
  14. id: 'fake_user',
  15. first_name: 'fake_user_first_name',
  16. email: 'fake@example.com'
  17. }
  18. function createMessages() {
  19. return [
  20. {
  21. id: '1',
  22. contents: ['a message'],
  23. user: currentUser,
  24. timestamp: new Date().getTime()
  25. },
  26. {
  27. id: '2',
  28. contents: ['another message'],
  29. user: currentUser,
  30. timestamp: new Date().getTime()
  31. }
  32. ]
  33. }
  34. before(function() {
  35. stubUIConfig()
  36. stubMathJax()
  37. })
  38. after(function() {
  39. tearDownUIConfigStubs()
  40. tearDownMathJaxStubs()
  41. })
  42. it('renders multiple messages', function() {
  43. render(
  44. <MessageList
  45. userId={currentUser.id}
  46. messages={createMessages()}
  47. resetUnreadMessages={() => {}}
  48. />
  49. )
  50. screen.getByText('a message')
  51. screen.getByText('another message')
  52. })
  53. it('renders a single timestamp for all messages within 5 minutes', function() {
  54. const msgs = createMessages()
  55. msgs[0].timestamp = new Date(2019, 6, 3, 4, 23).getTime()
  56. msgs[1].timestamp = new Date(2019, 6, 3, 4, 27).getTime()
  57. render(
  58. <MessageList
  59. userId={currentUser.id}
  60. messages={msgs}
  61. resetUnreadMessages={() => {}}
  62. />
  63. )
  64. screen.getByText('4:23 am Wed, 3rd Jul 19')
  65. expect(screen.queryByText('4:27 am Wed, 3rd Jul 19')).to.not.exist
  66. })
  67. it('renders a timestamp for each messages separated for more than 5 minutes', function() {
  68. const msgs = createMessages()
  69. msgs[0].timestamp = new Date(2019, 6, 3, 4, 23).getTime()
  70. msgs[1].timestamp = new Date(2019, 6, 3, 4, 31).getTime()
  71. render(
  72. <MessageList
  73. userId={currentUser.id}
  74. messages={msgs}
  75. resetUnreadMessages={() => {}}
  76. />
  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. <MessageList
  85. userId={currentUser.id}
  86. messages={createMessages()}
  87. resetUnreadMessages={resetUnreadMessages}
  88. />
  89. )
  90. fireEvent.click(screen.getByRole('list'))
  91. expect(resetUnreadMessages).to.be.calledOnce
  92. })
  93. })