Skip to content

Commit 1c141ee

Browse files
committed
Add more tests
1 parent 0a29c78 commit 1c141ee

File tree

1 file changed

+185
-36
lines changed

1 file changed

+185
-36
lines changed

StreamChatSwiftUITests/Tests/ChatChannel/ChatChannelViewModel_Tests.swift

Lines changed: 185 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
1717
channelController.channel_mock = initialChannel
1818
let viewModel = ChatChannelViewModel(channelController: channelController)
1919
XCTAssertEqual(initialChannel, viewModel.channel)
20-
20+
2121
// When
2222
let updatedChannel = ChatChannel.mock(cid: cid)
2323
channelController.channel_mock = updatedChannel
2424
channelController.delegate?.channelController(
2525
channelController,
2626
didUpdateChannel: .update(updatedChannel)
2727
)
28-
28+
2929
// Then
3030
XCTAssertEqual(updatedChannel, viewModel.channel)
3131
}
32-
32+
3333
func test_chatChannelVM_messagesLoaded() {
3434
// Given
3535
let channelController = makeChannelController()
@@ -485,63 +485,212 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
485485
// Then
486486
XCTAssert(viewModel.threadMessage == nil)
487487
}
488-
488+
489489
func test_chatChannelVM_jumpToInitialMessage() {
490490
// Given
491491
let message = ChatMessage.mock()
492492
let channelController = makeChannelController(messages: [message])
493493
let viewModel = ChatChannelViewModel(channelController: channelController)
494-
494+
495495
// When
496496
let shouldJump = viewModel.jumpToMessage(messageId: message.messageId)
497-
497+
498498
// Then
499499
XCTAssert(shouldJump == true)
500500
}
501-
501+
502502
func test_chatChannelVM_jumpToAvailableMessage() {
503503
// Given
504504
let message1 = ChatMessage.mock()
505505
let message2 = ChatMessage.mock()
506506
let channelController = makeChannelController(messages: [message1, message2])
507507
let viewModel = ChatChannelViewModel(channelController: channelController)
508-
508+
509509
// When
510510
let shouldJump = viewModel.jumpToMessage(messageId: message2.messageId)
511-
511+
512512
// Then
513513
XCTAssert(shouldJump == true)
514514
}
515-
515+
516516
func test_chatChannelVM_jumpToUnavailableMessage() {
517517
// Given
518518
let message1 = ChatMessage.mock()
519519
let message2 = ChatMessage.mock()
520520
let message3 = ChatMessage.mock()
521521
let channelController = makeChannelController(messages: [message1, message2])
522522
let viewModel = ChatChannelViewModel(channelController: channelController)
523-
523+
524524
// When
525525
let shouldJump = viewModel.jumpToMessage(messageId: message3.messageId)
526-
526+
527527
// Then
528528
XCTAssert(shouldJump == false)
529529
}
530-
530+
531531
func test_chatChannelVM_jumpToUnknownMessage() {
532532
// Given
533533
let message1 = ChatMessage.mock()
534534
let message2 = ChatMessage.mock()
535535
let channelController = makeChannelController(messages: [message1, message2])
536536
let viewModel = ChatChannelViewModel(channelController: channelController)
537-
537+
538538
// When
539539
let shouldJump = viewModel.jumpToMessage(messageId: .unknownMessageId)
540-
540+
541541
// Then
542542
XCTAssert(shouldJump == false)
543543
}
544-
544+
545+
func test_chatChannelVM_jumpToMessage_setsHighlightedMessageId() {
546+
// Given
547+
let message1 = ChatMessage.mock()
548+
let message2 = ChatMessage.mock()
549+
let channelController = makeChannelController(messages: [message1, message2])
550+
let viewModel = ChatChannelViewModel(channelController: channelController)
551+
let testExpectation = XCTestExpectation(description: "Highlight should be set")
552+
testExpectation.assertForOverFulfill = false
553+
554+
// When
555+
let shouldJump = viewModel.jumpToMessage(messageId: message2.messageId)
556+
557+
// Then
558+
XCTAssert(shouldJump == true)
559+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
560+
XCTAssertEqual(viewModel.highlightedMessageId, message2.messageId)
561+
testExpectation.fulfill()
562+
}
563+
564+
wait(for: [testExpectation], timeout: 1.0)
565+
}
566+
567+
func test_chatChannelVM_jumpToMessage_clearsHighlightedMessageId() {
568+
// Given
569+
let message1 = ChatMessage.mock()
570+
let message2 = ChatMessage.mock()
571+
let channelController = makeChannelController(messages: [message1, message2])
572+
let viewModel = ChatChannelViewModel(channelController: channelController)
573+
let testExpectation = XCTestExpectation(description: "Highlight should be cleared")
574+
575+
// When
576+
_ = viewModel.jumpToMessage(messageId: message2.messageId)
577+
578+
// Then
579+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
580+
XCTAssertNil(viewModel.highlightedMessageId)
581+
testExpectation.fulfill()
582+
}
583+
584+
wait(for: [testExpectation], timeout: 1.5)
585+
}
586+
587+
func test_chatChannelVM_jumpToMessage_setsScrolledId() {
588+
// Given
589+
let message1 = ChatMessage.mock()
590+
let message2 = ChatMessage.mock()
591+
let channelController = makeChannelController(messages: [message1, message2])
592+
let viewModel = ChatChannelViewModel(channelController: channelController)
593+
594+
// When
595+
_ = viewModel.jumpToMessage(messageId: message2.messageId)
596+
597+
// Then
598+
XCTAssertEqual(viewModel.scrolledId, message2.messageId)
599+
}
600+
601+
func test_chatChannelVM_selectedMessageThread_setsJumpToReplyId() {
602+
// Given
603+
let channelController = makeChannelController()
604+
let viewModel = ChatChannelViewModel(channelController: channelController)
605+
let message = ChatMessage.mock(
606+
id: .unique,
607+
cid: .unique,
608+
text: "Test message",
609+
author: .mock(id: .unique)
610+
)
611+
612+
// When
613+
NotificationCenter.default.post(
614+
name: NSNotification.Name(MessageRepliesConstants.selectedMessageThread),
615+
object: nil,
616+
userInfo: [MessageRepliesConstants.selectedMessage: message]
617+
)
618+
619+
// Then
620+
XCTAssertEqual(viewModel.threadMessage, message)
621+
XCTAssertTrue(viewModel.threadMessageShown)
622+
XCTAssertEqual(viewModel.messageCachingUtils.jumpToReplyId, message.messageId)
623+
}
624+
625+
func test_chatChannelVM_selectedMessageThread_withThreadReplyMessage() {
626+
// Given
627+
let channelController = makeChannelController()
628+
let viewModel = ChatChannelViewModel(channelController: channelController)
629+
let parentMessage = ChatMessage.mock(
630+
id: .unique,
631+
cid: .unique,
632+
text: "Parent message",
633+
author: .mock(id: .unique)
634+
)
635+
let replyMessage = ChatMessage.mock(
636+
id: .unique,
637+
cid: .unique,
638+
text: "Reply message",
639+
author: .mock(id: .unique),
640+
parentMessageId: parentMessage.id
641+
)
642+
643+
// When
644+
NotificationCenter.default.post(
645+
name: NSNotification.Name(MessageRepliesConstants.selectedMessageThread),
646+
object: nil,
647+
userInfo: [
648+
MessageRepliesConstants.selectedMessage: parentMessage,
649+
MessageRepliesConstants.threadReplyMessage: replyMessage
650+
]
651+
)
652+
653+
// Then
654+
XCTAssertEqual(viewModel.threadMessage, parentMessage)
655+
XCTAssertTrue(viewModel.threadMessageShown)
656+
XCTAssertEqual(viewModel.messageCachingUtils.jumpToReplyId, replyMessage.messageId)
657+
}
658+
659+
func test_chatChannelVM_threadViewHighlightsMessage() {
660+
// Given
661+
let channelController = makeChannelController()
662+
let messageController = ChatMessageControllerSUI_Mock.mock(
663+
chatClient: chatClient,
664+
cid: .unique,
665+
messageId: .unique
666+
)
667+
let viewModel = ChatChannelViewModel(
668+
channelController: channelController,
669+
messageController: messageController
670+
)
671+
let replyMessageId = "reply-message-id"
672+
viewModel.messageCachingUtils.jumpToReplyId = replyMessageId
673+
let testExpectation = XCTestExpectation(description: "Highlight should be set in thread")
674+
testExpectation.assertForOverFulfill = false
675+
676+
// When - simulate the initialization path that checks jumpToReplyId
677+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
678+
// Simulate thread view appearing and checking jumpToReplyId
679+
if let jumpToReplyId = viewModel.messageCachingUtils.jumpToReplyId {
680+
viewModel.scrolledId = jumpToReplyId
681+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
682+
viewModel.highlightedMessageId = jumpToReplyId
683+
testExpectation.fulfill()
684+
}
685+
}
686+
}
687+
688+
// Then
689+
wait(for: [testExpectation], timeout: 1.0)
690+
XCTAssertEqual(viewModel.highlightedMessageId, replyMessageId)
691+
XCTAssertEqual(viewModel.scrolledId, replyMessageId)
692+
}
693+
545694
func test_chatChannelVM_crashWhenIndexAccess() {
546695
// Given
547696
let message1 = ChatMessage.mock()
@@ -550,7 +699,7 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
550699
let channelController = makeChannelController(messages: [message1, message2])
551700
let viewModel = ChatChannelViewModel(channelController: channelController)
552701
let newMessages = LazyCachedMapCollection(elements: [message1, message2, message3])
553-
702+
554703
// When
555704
viewModel.dataSource(
556705
channelDataSource: ChatChannelDataSource(controller: channelController),
@@ -561,11 +710,11 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
561710
.update(message3, index: IndexPath(row: 3, section: 0)) // intentionally invalid path
562711
]
563712
)
564-
713+
565714
// Then
566715
XCTAssertEqual(3, viewModel.messages.count)
567716
}
568-
717+
569718
func test_chatChannelVM_keepFirstUnreadIndexSetAfterMarkingTheChannelAsRead() {
570719
// Given
571720
let message1 = ChatMessage.mock()
@@ -576,26 +725,26 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
576725
let viewModel = ChatChannelViewModel(channelController: channelController)
577726
viewModel.firstUnreadMessageId = message1.id
578727
viewModel.throttler = Throttler_Mock(interval: 0)
579-
728+
580729
// When
581730
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
582-
731+
583732
// Then
584733
XCTAssertEqual(1, channelController.markReadCallCount)
585734
XCTAssertNotNil(viewModel.firstUnreadMessageId)
586735
}
587-
736+
588737
// MARK: - currentUserMarkedMessageUnread Tests
589-
738+
590739
func test_chatChannelVM_currentUserMarkedMessageUnread_initialValue() {
591740
// Given
592741
let channelController = makeChannelController()
593742
let viewModel = ChatChannelViewModel(channelController: channelController)
594-
743+
595744
// Then
596745
XCTAssertFalse(viewModel.currentUserMarkedMessageUnread)
597746
}
598-
747+
599748
func test_chatChannelVM_sendReadEventIfNeeded_whenCurrentUserMarkedMessageUnreadIsTrue() {
600749
// Given
601750
let message = ChatMessage.mock()
@@ -604,14 +753,14 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
604753
let viewModel = ChatChannelViewModel(channelController: channelController)
605754
viewModel.currentUserMarkedMessageUnread = true
606755
viewModel.throttler = Throttler_Mock(interval: 0)
607-
756+
608757
// When
609758
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
610-
759+
611760
// Then
612761
XCTAssertEqual(0, channelController.markReadCallCount)
613762
}
614-
763+
615764
func test_chatChannelVM_sendReadEventIfNeeded_whenCurrentUserMarkedMessageUnreadIsFalse() {
616765
// Given
617766
let message = ChatMessage.mock()
@@ -620,14 +769,14 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
620769
let viewModel = ChatChannelViewModel(channelController: channelController)
621770
viewModel.currentUserMarkedMessageUnread = false
622771
viewModel.throttler = Throttler_Mock(interval: 0)
623-
772+
624773
// When
625774
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
626-
775+
627776
// Then
628777
XCTAssertEqual(1, channelController.markReadCallCount)
629778
}
630-
779+
631780
func test_chatChannelVM_sendReadEventIfNeeded_whenChannelHasNoUnreadMessages() {
632781
// Given
633782
let message = ChatMessage.mock()
@@ -636,14 +785,14 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
636785
let viewModel = ChatChannelViewModel(channelController: channelController)
637786
viewModel.currentUserMarkedMessageUnread = false
638787
viewModel.throttler = Throttler_Mock(interval: 0)
639-
788+
640789
// When
641790
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
642-
791+
643792
// Then
644793
XCTAssertEqual(0, channelController.markReadCallCount)
645794
}
646-
795+
647796
func test_chatChannelVM_sendReadEventIfNeeded_whenChannelIsNil() {
648797
// Given
649798
let message = ChatMessage.mock()
@@ -652,10 +801,10 @@ class ChatChannelViewModel_Tests: StreamChatTestCase {
652801
let viewModel = ChatChannelViewModel(channelController: channelController)
653802
viewModel.currentUserMarkedMessageUnread = false
654803
viewModel.throttler = Throttler_Mock(interval: 0)
655-
804+
656805
// When
657806
viewModel.handleMessageAppear(index: 0, scrollDirection: .down)
658-
807+
659808
// Then
660809
XCTAssertEqual(0, channelController.markReadCallCount)
661810
}

0 commit comments

Comments
 (0)