status-desktop/test/nim/message_model_test.nim
Pascal Precht bf7148efd6 fix: make avatar info in replies of imported messages work again
Because we've switched to `QuotedMessage` as an attached payload to
messages to make message replies data more reliable, we lost some of
the author information in imported messages, that was available prior
to that move.

This commit introduces `quotedMessageAuthorDisplayName` and
`quotedMessageAuthorAvatar` to our model so it can be set in case
we can't retrieve contact details for a given message (which is always
the case for imported messages)
2023-01-17 12:48:56 +01:00

307 lines
11 KiB
Nim

import unittest
import ../../../src/app_service/common/types
import ../../../src/app_service/service/contacts/dto/contacts
import ../../../src/app_service/service/message/dto/message
import ../../../src/app/modules/shared_models/message_model
import ../../../src/app/modules/shared_models/message_item
import ../../../src/app/modules/shared_models/message_transaction_parameters_item
proc createTestMessageItem(id: string, clock: int64): Item =
return initItem(
id = id,
communityId = "",
responseToMessageWithId = "",
senderId = "",
senderDisplayName = "",
senderOptionalName = "",
senderIcon = "",
amISender = false,
senderIsAdded = false,
outgoingStatus = "",
text = "",
unparsedText = "",
image = "",
messageContainsMentions = false,
seen = true,
timestamp = 0,
clock = clock,
contentType = ContentType.Unknown,
messageType = -1,
contactRequestState = 0,
sticker = "",
stickerPack = -1,
links = @[],
transactionParameters = newTransactionParametersItem("","","","","","",-1,""),
mentionedUsersPks = @[],
senderTrustStatus = TrustStatus.Unknown,
senderEnsVerified = false,
discordMessage = DiscordMessage(),
resendError = "",
mentioned = false,
quotedMessageFrom = "",
quotedMessageText = "",
quotedMessageParsedText = "",
quotedMessageContentType = -1,
quotedMessageDeleted = false,
quotedMessageDiscordMessage = DiscordMessage(),
)
let message0_chatIdentifier = createTestMessageItem("chat-identifier", -2)
let message0_fetchMoreMessages = createTestMessageItem("fetch-more-messages", -1)
let message1 = createTestMessageItem("0xa", 1)
let message2 = createTestMessageItem("0xb", 2)
let message3 = createTestMessageItem("0xc", 3)
let message4 = createTestMessageItem("0xd", 3)
let message5 = createTestMessageItem("0xe", 4)
template checkOrder(model: Model) =
require(model.items.len == 7)
check(model.items[0].id == message5.id)
check(model.items[1].id == message4.id)
check(model.items[2].id == message3.id)
check(model.items[3].id == message2.id)
check(model.items[4].id == message1.id)
check(model.items[5].id == message0_fetchMoreMessages.id)
check(model.items[6].id == message0_chatIdentifier.id)
suite "empty model":
let model = newModel()
test "initial size":
require(model.rowCount() == 0)
# newest messages should be first, break ties by message id
suite "inserting new messages":
setup:
let model = newModel()
model.insertItemsBasedOnClock(@[message0_fetchMoreMessages, message0_chatIdentifier])
test "insert same message twice":
model.insertItemBasedOnClock(message1)
check(model.rowCount() == 3)
model.insertItemBasedOnClock(message1)
check(model.rowCount() == 3)
test "insert in order":
model.insertItemBasedOnClock(message1)
check(model.rowCount() == 3)
model.insertItemBasedOnClock(message2)
check(model.rowCount() == 4)
model.insertItemBasedOnClock(message3)
check(model.rowCount() == 5)
model.insertItemBasedOnClock(message4)
check(model.rowCount() == 6)
model.insertItemBasedOnClock(message5)
check(model.rowCount() == 7)
checkOrder(model)
test "insert out of order":
model.insertItemBasedOnClock(message5)
check(model.rowCount() == 3)
model.insertItemBasedOnClock(message4)
check(model.rowCount() == 4)
model.insertItemBasedOnClock(message3)
check(model.rowCount() == 5)
model.insertItemBasedOnClock(message2)
check(model.rowCount() == 6)
model.insertItemBasedOnClock(message1)
check(model.rowCount() == 7)
checkOrder(model)
test "insert out of order (randomly)":
model.insertItemBasedOnClock(message3)
check(model.rowCount() == 3)
model.insertItemBasedOnClock(message1)
check(model.rowCount() == 4)
model.insertItemBasedOnClock(message4)
check(model.rowCount() == 5)
model.insertItemBasedOnClock(message2)
check(model.rowCount() == 6)
model.insertItemBasedOnClock(message5)
check(model.rowCount() == 7)
checkOrder(model)
suite "inserting multiple new messages":
setup:
let model = newModel()
model.insertItemsBasedOnClock(@[message0_fetchMoreMessages, message0_chatIdentifier])
test "insert to empty model":
model.insertItemsBasedOnClock(@[message5,
message4,
message3,
message2,
message1])
checkOrder(model)
test "insert to model with only newer messages":
model.insertItemBasedOnClock(message5)
model.insertItemBasedOnClock(message4)
model.insertItemsBasedOnClock(@[message3,
message2,
message1])
checkOrder(model)
test "insert to model with only older messages":
model.insertItemBasedOnClock(message2)
model.insertItemBasedOnClock(message1)
model.insertItemsBasedOnClock(@[message5,
message4,
message3])
checkOrder(model)
test "insert to model with newer and older messages":
model.insertItemBasedOnClock(message5)
model.insertItemBasedOnClock(message1)
model.insertItemsBasedOnClock(@[message4,
message3,
message2])
checkOrder(model)
test "insert to model with newer and older messages and some in between":
model.insertItemBasedOnClock(message5)
model.insertItemBasedOnClock(message1)
model.insertItemBasedOnClock(message3) # in between
model.insertItemsBasedOnClock(@[message4,
message2])
checkOrder(model)
suite "new messages marker":
setup:
let model = newModel()
model.insertItemsBasedOnClock(@[message0_fetchMoreMessages, message0_chatIdentifier])
test "set new messages marker":
model.insertItemsBasedOnClock(@[message1,
message2])
require(model.items.len == 4)
# add new messages marker
model.setFirstUnseenMessageId(message2.id)
model.resetNewMessagesMarker()
require(model.items.len == 5)
check(model.items[0].id == message2.id)
check(model.items[1].contentType == ContentType.NewMessagesMarker)
check(model.items[2].id == message1.id)
check(model.items[3].id == message0_fetchMoreMessages.id)
check(model.items[4].id == message0_chatIdentifier.id)
test "remove new messages marker":
model.insertItemsBasedOnClock(@[message1,
message2])
require(model.items.len == 4)
# add new messages marker
model.setFirstUnseenMessageId(message2.id)
model.resetNewMessagesMarker()
require(model.items.len == 5)
# remove new messages marker
model.setFirstUnseenMessageId("")
model.resetNewMessagesMarker()
require(model.items.len == 4)
check(model.items[0].id == message2.id)
check(model.items[1].id == message1.id)
check(model.items[2].id == message0_fetchMoreMessages.id)
check(model.items[3].id == message0_chatIdentifier.id)
suite "simulations":
setup:
let model = newModel()
model.insertItemsBasedOnClock(@[message0_fetchMoreMessages, message0_chatIdentifier])
test "simulate messages loading":
# load first two messages
var loadedMessages: seq[Item]
loadedMessages.add(message5)
loadedMessages.add(message4)
model.removeItem(message0_fetchMoreMessages.id)
model.removeItem(message0_chatIdentifier.id)
loadedMessages.add(message0_fetchMoreMessages)
loadedMessages.add(message0_chatIdentifier)
model.insertItemsBasedOnClock(loadedMessages)
require(model.items.len == 4)
check(model.items[0].id == message5.id)
check(model.items[1].id == message4.id)
check(model.items[2].id == message0_fetchMoreMessages.id)
check(model.items[3].id == message0_chatIdentifier.id)
# set new messages marker
model.setFirstUnseenMessageId(message5.id)
model.resetNewMessagesMarker()
require(model.items.len == 5)
check(model.items[0].id == message5.id)
check(model.items[1].contentType == ContentType.NewMessagesMarker)
check(model.items[2].id == message4.id)
check(model.items[3].id == message0_fetchMoreMessages.id)
check(model.items[4].id == message0_chatIdentifier.id)
# load next two messages
loadedMessages = @[]
loadedMessages.add(message3)
loadedMessages.add(message2)
model.removeItem(message0_fetchMoreMessages.id)
model.removeItem(message0_chatIdentifier.id)
loadedMessages.add(message0_fetchMoreMessages)
loadedMessages.add(message0_chatIdentifier)
model.insertItemsBasedOnClock(loadedMessages)
require(model.items.len == 7)
check(model.items[0].id == message5.id)
check(model.items[1].contentType == ContentType.NewMessagesMarker)
check(model.items[2].id == message4.id)
check(model.items[3].id == message3.id)
check(model.items[4].id == message2.id)
check(model.items[5].id == message0_fetchMoreMessages.id)
check(model.items[6].id == message0_chatIdentifier.id)
# load last message
loadedMessages = @[]
loadedMessages.add(message1)
model.removeItem(message0_fetchMoreMessages.id)
model.removeItem(message0_chatIdentifier.id)
loadedMessages.add(message0_fetchMoreMessages)
loadedMessages.add(message0_chatIdentifier)
model.insertItemsBasedOnClock(loadedMessages)
require(model.items.len == 8)
check(model.items[0].id == message5.id)
check(model.items[1].contentType == ContentType.NewMessagesMarker)
check(model.items[2].id == message4.id)
check(model.items[3].id == message3.id)
check(model.items[4].id == message2.id)
check(model.items[5].id == message1.id)
check(model.items[6].id == message0_fetchMoreMessages.id)
check(model.items[7].id == message0_chatIdentifier.id)
test "simulate chat identifier update":
model.insertItemsBasedOnClock(@[message5,
message4,
message3,
message2,
message1])
checkOrder(model)
# set new messages marker
model.setFirstUnseenMessageId(message4.id)
model.resetNewMessagesMarker()
# update chat identifier
model.removeItem(message0_chatIdentifier.id)
model.insertItemBasedOnClock(message0_chatIdentifier)
require(model.items.len == 8)
check(model.items[0].id == message5.id)
check(model.items[1].id == message4.id)
check(model.items[2].contentType == ContentType.NewMessagesMarker)
check(model.items[3].id == message3.id)
check(model.items[4].id == message2.id)
check(model.items[5].id == message1.id)
check(model.items[6].id == message0_fetchMoreMessages.id)
check(model.items[7].id == message0_chatIdentifier.id)