@@ -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