message-list-appender.test.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. const uniqueMessageIds = []
  42. expect(
  43. prependMessages([], messages, uniqueMessageIds).messages
  44. ).to.deep.equal([
  45. {
  46. id: messages[0].id,
  47. timestamp: messages[0].timestamp,
  48. user: messages[0].user,
  49. contents: [messages[0].content, messages[1].content],
  50. },
  51. ])
  52. })
  53. describe('when the messages to prepend are from the same user', function () {
  54. let list, messages, uniqueMessageIds
  55. beforeEach(function () {
  56. list = createTestMessageList()
  57. messages = createTestMessages()
  58. messages[0].user = testUser // makes all the messages have the same author
  59. uniqueMessageIds = []
  60. })
  61. it('when the prepended messages are close in time, contents should be merged into the same message', function () {
  62. const result = prependMessages(
  63. createTestMessageList(),
  64. messages,
  65. uniqueMessageIds
  66. ).messages
  67. expect(result.length).to.equal(list.length + 1)
  68. expect(result[0]).to.deep.equal({
  69. id: messages[0].id,
  70. timestamp: messages[0].timestamp,
  71. user: messages[0].user,
  72. contents: [messages[0].content, messages[1].content],
  73. })
  74. })
  75. it('when the prepended messages are separated in time, each message is prepended', function () {
  76. messages[0].timestamp = messages[1].timestamp - 6 * 60 * 1000 // 6 minutes before the next message
  77. const result = prependMessages(
  78. createTestMessageList(),
  79. messages,
  80. uniqueMessageIds
  81. ).messages
  82. expect(result.length).to.equal(list.length + 2)
  83. expect(result[0]).to.deep.equal({
  84. id: messages[0].id,
  85. timestamp: messages[0].timestamp,
  86. user: messages[0].user,
  87. contents: [messages[0].content],
  88. })
  89. expect(result[1]).to.deep.equal({
  90. id: messages[1].id,
  91. timestamp: messages[1].timestamp,
  92. user: messages[1].user,
  93. contents: [messages[1].content],
  94. })
  95. })
  96. })
  97. describe('when the messages to prepend are from different users', function () {
  98. let list, messages, uniqueMessageIds
  99. beforeEach(function () {
  100. list = createTestMessageList()
  101. messages = createTestMessages()
  102. uniqueMessageIds = []
  103. })
  104. it('should prepend separate messages to the list', function () {
  105. messages[0].user = otherUser
  106. const result = prependMessages(
  107. createTestMessageList(),
  108. messages,
  109. uniqueMessageIds
  110. ).messages
  111. expect(result.length).to.equal(list.length + 2)
  112. expect(result[0]).to.deep.equal({
  113. id: messages[0].id,
  114. timestamp: messages[0].timestamp,
  115. user: messages[0].user,
  116. contents: [messages[0].content],
  117. })
  118. expect(result[1]).to.deep.equal({
  119. id: messages[1].id,
  120. timestamp: messages[1].timestamp,
  121. user: messages[1].user,
  122. contents: [messages[1].content],
  123. })
  124. })
  125. })
  126. it('should merge the prepended messages into the first existing one when user is same user and are close in time', function () {
  127. const list = createTestMessageList()
  128. const messages = createTestMessages()
  129. messages[0].user = messages[1].user = list[0].user
  130. const uniqueMessageIds = []
  131. const result = prependMessages(
  132. createTestMessageList(),
  133. messages,
  134. uniqueMessageIds
  135. ).messages
  136. expect(result.length).to.equal(list.length)
  137. expect(result[0]).to.deep.equal({
  138. id: messages[0].id,
  139. timestamp: messages[0].timestamp,
  140. user: messages[0].user,
  141. contents: [messages[0].content, messages[1].content, ...list[0].contents],
  142. })
  143. })
  144. })
  145. describe('appendMessage()', function () {
  146. function createTestMessage() {
  147. return {
  148. id: 'appended_message',
  149. content: 'hi!',
  150. timestamp: new Date().getTime(),
  151. user: testUser,
  152. }
  153. }
  154. it('to an empty list', function () {
  155. const testMessage = createTestMessage()
  156. const uniqueMessageIds = []
  157. expect(
  158. appendMessage([], testMessage, uniqueMessageIds).messages
  159. ).to.deep.equal([
  160. {
  161. id: 'appended_message',
  162. timestamp: testMessage.timestamp,
  163. user: testMessage.user,
  164. contents: [testMessage.content],
  165. },
  166. ])
  167. })
  168. describe('messages appended shortly after the last message on the list', function () {
  169. let list, message, uniqueMessageIds
  170. beforeEach(function () {
  171. list = createTestMessageList()
  172. message = createTestMessage()
  173. message.timestamp = list[1].timestamp + 6 * 1000 // 6 seconds after the last message in the list
  174. uniqueMessageIds = []
  175. })
  176. describe('when the author is the same as the last message', function () {
  177. it('should append the content to the last message', function () {
  178. const result = appendMessage(list, message, uniqueMessageIds).messages
  179. expect(result.length).to.equal(list.length)
  180. expect(result[1].contents).to.deep.equal(
  181. list[1].contents.concat(message.content)
  182. )
  183. })
  184. it('should update the last message timestamp', function () {
  185. const result = appendMessage(list, message, uniqueMessageIds).messages
  186. expect(result[1].timestamp).to.equal(message.timestamp)
  187. })
  188. })
  189. describe('when the author is different than the last message', function () {
  190. beforeEach(function () {
  191. message.user = otherUser
  192. })
  193. it('should append the new message to the list', function () {
  194. const result = appendMessage(list, message, uniqueMessageIds).messages
  195. expect(result.length).to.equal(list.length + 1)
  196. expect(result[2]).to.deep.equal({
  197. id: 'appended_message',
  198. timestamp: message.timestamp,
  199. user: message.user,
  200. contents: [message.content],
  201. })
  202. })
  203. })
  204. })
  205. describe('messages appended later after the last message on the list', function () {
  206. let list, message, uniqueMessageIds
  207. beforeEach(function () {
  208. list = createTestMessageList()
  209. message = createTestMessage()
  210. message.timestamp = list[1].timestamp + 6 * 60 * 1000 // 6 minutes after the last message in the list
  211. uniqueMessageIds = []
  212. })
  213. it('when the author is the same as the last message, should be appended as new message', function () {
  214. const result = appendMessage(list, message, uniqueMessageIds).messages
  215. expect(result.length).to.equal(3)
  216. expect(result[2]).to.deep.equal({
  217. id: 'appended_message',
  218. timestamp: message.timestamp,
  219. user: message.user,
  220. contents: [message.content],
  221. })
  222. })
  223. it('when the author is the different than the last message, should be appended as new message', function () {
  224. message.user = otherUser
  225. const result = appendMessage(list, message, uniqueMessageIds).messages
  226. expect(result.length).to.equal(3)
  227. expect(result[2]).to.deep.equal({
  228. id: 'appended_message',
  229. timestamp: message.timestamp,
  230. user: message.user,
  231. contents: [message.content],
  232. })
  233. })
  234. })
  235. })