message-list-appender.test.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import { expect } from 'chai'
  2. import {
  3. appendMessage,
  4. prependMessages,
  5. } from '../../../../../frontend/js/features/chat/utils/message-list-appender'
  6. const testUser = {
  7. id: '123abc',
  8. }
  9. const otherUser = {
  10. id: '234other',
  11. }
  12. function createTestMessageList() {
  13. return [
  14. {
  15. id: 'msg_1',
  16. contents: ['hello', 'world'],
  17. timestamp: new Date().getTime(),
  18. user: otherUser,
  19. },
  20. {
  21. id: 'msg_2',
  22. contents: ['foo'],
  23. timestamp: new Date().getTime(),
  24. user: testUser,
  25. },
  26. ]
  27. }
  28. describe('prependMessages()', function () {
  29. function createTestMessages() {
  30. const message1 = {
  31. id: 'prepended_message',
  32. content: 'hello',
  33. timestamp: new Date().getTime(),
  34. user: testUser,
  35. }
  36. const message2 = { ...message1, id: 'prepended_message_2' }
  37. return [message1, message2]
  38. }
  39. it('to an empty list', function () {
  40. const messages = createTestMessages()
  41. expect(prependMessages([], messages)).to.deep.equal([
  42. {
  43. id: messages[0].id,
  44. timestamp: messages[0].timestamp,
  45. user: messages[0].user,
  46. contents: [messages[0].content, messages[1].content],
  47. },
  48. ])
  49. })
  50. describe('when the messages to prepend are from the same user', function () {
  51. let list, messages
  52. beforeEach(function () {
  53. list = createTestMessageList()
  54. messages = createTestMessages()
  55. messages[0].user = testUser // makes all the messages have the same author
  56. })
  57. it('when the prepended messages are close in time, contents should be merged into the same message', function () {
  58. const result = prependMessages(createTestMessageList(), messages)
  59. expect(result.length).to.equal(list.length + 1)
  60. expect(result[0]).to.deep.equal({
  61. id: messages[0].id,
  62. timestamp: messages[0].timestamp,
  63. user: messages[0].user,
  64. contents: [messages[0].content, messages[1].content],
  65. })
  66. })
  67. it('when the prepended messages are separated in time, each message is prepended', function () {
  68. messages[0].timestamp = messages[1].timestamp - 6 * 60 * 1000 // 6 minutes before the next message
  69. const result = prependMessages(createTestMessageList(), messages)
  70. expect(result.length).to.equal(list.length + 2)
  71. expect(result[0]).to.deep.equal({
  72. id: messages[0].id,
  73. timestamp: messages[0].timestamp,
  74. user: messages[0].user,
  75. contents: [messages[0].content],
  76. })
  77. expect(result[1]).to.deep.equal({
  78. id: messages[1].id,
  79. timestamp: messages[1].timestamp,
  80. user: messages[1].user,
  81. contents: [messages[1].content],
  82. })
  83. })
  84. })
  85. describe('when the messages to prepend are from different users', function () {
  86. let list, messages
  87. beforeEach(function () {
  88. list = createTestMessageList()
  89. messages = createTestMessages()
  90. })
  91. it('should prepend separate messages to the list', function () {
  92. messages[0].user = otherUser
  93. const result = prependMessages(createTestMessageList(), messages)
  94. expect(result.length).to.equal(list.length + 2)
  95. expect(result[0]).to.deep.equal({
  96. id: messages[0].id,
  97. timestamp: messages[0].timestamp,
  98. user: messages[0].user,
  99. contents: [messages[0].content],
  100. })
  101. expect(result[1]).to.deep.equal({
  102. id: messages[1].id,
  103. timestamp: messages[1].timestamp,
  104. user: messages[1].user,
  105. contents: [messages[1].content],
  106. })
  107. })
  108. })
  109. it('should merge the prepended messages into the first existing one when user is same user and are close in time', function () {
  110. const list = createTestMessageList()
  111. const messages = createTestMessages()
  112. messages[0].user = messages[1].user = list[0].user
  113. const result = prependMessages(createTestMessageList(), messages)
  114. expect(result.length).to.equal(list.length)
  115. expect(result[0]).to.deep.equal({
  116. id: messages[0].id,
  117. timestamp: messages[0].timestamp,
  118. user: messages[0].user,
  119. contents: [messages[0].content, messages[1].content, ...list[0].contents],
  120. })
  121. })
  122. })
  123. describe('appendMessage()', function () {
  124. function createTestMessage() {
  125. return {
  126. id: 'appended_message',
  127. content: 'hi!',
  128. timestamp: new Date().getTime(),
  129. user: testUser,
  130. }
  131. }
  132. it('to an empty list', function () {
  133. const testMessage = createTestMessage()
  134. expect(appendMessage([], testMessage)).to.deep.equal([
  135. {
  136. id: 'appended_message',
  137. timestamp: testMessage.timestamp,
  138. user: testMessage.user,
  139. contents: [testMessage.content],
  140. },
  141. ])
  142. })
  143. describe('messages appended shortly after the last message on the list', function () {
  144. let list, message
  145. beforeEach(function () {
  146. list = createTestMessageList()
  147. message = createTestMessage()
  148. message.timestamp = list[1].timestamp + 6 * 1000 // 6 seconds after the last message in the list
  149. })
  150. describe('when the author is the same as the last message', function () {
  151. it('should append the content to the last message', function () {
  152. const result = appendMessage(list, message)
  153. expect(result.length).to.equal(list.length)
  154. expect(result[1].contents).to.deep.equal(
  155. list[1].contents.concat(message.content)
  156. )
  157. })
  158. it('should update the last message timestamp', function () {
  159. const result = appendMessage(list, message)
  160. expect(result[1].timestamp).to.equal(message.timestamp)
  161. })
  162. })
  163. describe('when the author is different than the last message', function () {
  164. beforeEach(function () {
  165. message.user = otherUser
  166. })
  167. it('should append the new message to the list', function () {
  168. const result = appendMessage(list, message)
  169. expect(result.length).to.equal(list.length + 1)
  170. expect(result[2]).to.deep.equal({
  171. id: 'appended_message',
  172. timestamp: message.timestamp,
  173. user: message.user,
  174. contents: [message.content],
  175. })
  176. })
  177. })
  178. })
  179. describe('messages appended later after the last message on the list', function () {
  180. let list, message
  181. beforeEach(function () {
  182. list = createTestMessageList()
  183. message = createTestMessage()
  184. message.timestamp = list[1].timestamp + 6 * 60 * 1000 // 6 minutes after the last message in the list
  185. })
  186. it('when the author is the same as the last message, should be appended as new message', function () {
  187. const result = appendMessage(list, message)
  188. expect(result.length).to.equal(3)
  189. expect(result[2]).to.deep.equal({
  190. id: 'appended_message',
  191. timestamp: message.timestamp,
  192. user: message.user,
  193. contents: [message.content],
  194. })
  195. })
  196. it('when the author is the different than the last message, should be appended as new message', function () {
  197. message.user = otherUser
  198. const result = appendMessage(list, message)
  199. expect(result.length).to.equal(3)
  200. expect(result[2]).to.deep.equal({
  201. id: 'appended_message',
  202. timestamp: message.timestamp,
  203. user: message.user,
  204. contents: [message.content],
  205. })
  206. })
  207. })
  208. })