message-list-appender.test.tsx 8.2 KB

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