@@ -14,6 +14,7 @@ import 'package:zulip/api/route/messages.dart';
14
14
import 'package:zulip/model/localizations.dart' ;
15
15
import 'package:zulip/model/narrow.dart' ;
16
16
import 'package:zulip/model/store.dart' ;
17
+ import 'package:zulip/widgets/autocomplete.dart' ;
17
18
import 'package:zulip/widgets/content.dart' ;
18
19
import 'package:zulip/widgets/emoji_reaction.dart' ;
19
20
import 'package:zulip/widgets/icons.dart' ;
@@ -620,6 +621,95 @@ void main() {
620
621
});
621
622
});
622
623
624
+ group ('Update Narrow on message move' , () {
625
+ final channel = eg.stream (name: 'move test stream' );
626
+ final otherChannel = eg.stream (name: 'other move test stream' );
627
+
628
+ void prepareGetMessageResponse (List <Message > messages) {
629
+ connection.prepare (json: newestResult (
630
+ foundOldest: false , messages: messages).toJson ());
631
+ }
632
+
633
+ void handleMessageMoveEvent (List <StreamMessage > messages, String newTopic, {int ? newChannelId}) {
634
+ store.handleEvent (eg.updateMessageEventMoveFrom (
635
+ origMessages: messages,
636
+ newTopic: newTopic,
637
+ newStreamId: newChannelId,
638
+ propagateMode: PropagateMode .changeAll));
639
+ }
640
+
641
+ testWidgets ('compose box send message after move' , (WidgetTester tester) async {
642
+ final message = eg.streamMessage (stream: channel, content: 'Message to move' );
643
+ final narrow = TopicNarrow .ofMessage (message);
644
+ await setupMessageListPage (tester, narrow: narrow, messages: [message], streams: [channel, otherChannel]);
645
+
646
+ final channelContentInputFinder = find.descendant (
647
+ of: find.byType (ComposeAutocomplete ),
648
+ matching: find.byType (TextField ));
649
+
650
+ await tester.enterText (channelContentInputFinder, 'Some text' );
651
+ check (tester.widget <TextField >(channelContentInputFinder))
652
+ ..decoration.isNotNull ().hintText.equals ('Message #${channel .name } > example topic' )
653
+ ..controller.isNotNull ().text.equals ('Some text' );
654
+ prepareGetMessageResponse ([message]);
655
+ handleMessageMoveEvent ([message], 'new topic' , newChannelId: otherChannel.streamId);
656
+ await tester.pump (const Duration (seconds: 1 ));
657
+ check (tester.widget <TextField >(channelContentInputFinder))
658
+ ..decoration.isNotNull ().hintText.equals ('Message #${otherChannel .name } > new topic' )
659
+ ..controller.isNotNull ().text.equals ('Some text' );
660
+
661
+ connection.prepare (json: SendMessageResult (id: 1 ).toJson ());
662
+ await tester.tap (find.byIcon (Icons .send));
663
+ await tester.pump ();
664
+ check (connection.lastRequest).isA< http.Request > ()
665
+ ..method.equals ('POST' )
666
+ ..url.path.equals ('/api/v1/messages' )
667
+ ..bodyFields.deepEquals ({
668
+ 'type' : 'stream' ,
669
+ 'to' : '${otherChannel .streamId }' ,
670
+ 'topic' : 'new topic' ,
671
+ 'content' : 'Some text' ,
672
+ 'read_by_sender' : 'true' });
673
+ await tester.pumpAndSettle ();
674
+ });
675
+
676
+ testWidgets ('Move to narrow with existing messages' , (WidgetTester tester) async {
677
+ final message = eg.streamMessage (stream: channel, content: 'Message to move' );
678
+ final narrow = TopicNarrow .ofMessage (message);
679
+ await setupMessageListPage (tester, narrow: narrow, messages: [message], streams: [channel]);
680
+ check (find.textContaining ('Existing message' ).evaluate ()).length.equals (0 );
681
+ check (find.textContaining ('Message to move' ).evaluate ()).length.equals (1 );
682
+
683
+ final existingMessage = eg.streamMessage (
684
+ stream: eg.stream (), topic: 'new topic' , content: 'Existing message' );
685
+ prepareGetMessageResponse ([existingMessage, message]);
686
+ handleMessageMoveEvent ([message], 'new topic' );
687
+ await tester.pump (const Duration (seconds: 1 ));
688
+
689
+ check (find.textContaining ('Existing message' ).evaluate ()).length.equals (1 );
690
+ check (find.textContaining ('Message to move' ).evaluate ()).length.equals (1 );
691
+ });
692
+
693
+ testWidgets ('show new topic in TopicNarrow after move' , (tester) async {
694
+ final message = eg.streamMessage (stream: channel, content: 'Message to move' );
695
+ final narrow = TopicNarrow .ofMessage (message);
696
+ await setupMessageListPage (tester, narrow: narrow, messages: [message], streams: [channel]);
697
+
698
+ prepareGetMessageResponse ([message]);
699
+ handleMessageMoveEvent ([message], 'new topic' );
700
+ await tester.pump (const Duration (seconds: 1 ));
701
+
702
+ check (find.descendant (
703
+ of: find.byType (RecipientHeader ),
704
+ matching: find.text ('new topic' )).evaluate ()
705
+ ).length.equals (1 );
706
+ check (find.descendant (
707
+ of: find.byType (MessageListAppBarTitle ),
708
+ matching: find.text ('${channel .name } > new topic' )).evaluate ()
709
+ ).length.equals (1 );
710
+ });
711
+ });
712
+
623
713
group ('recipient headers' , () {
624
714
group ('StreamMessageRecipientHeader' , () {
625
715
final stream = eg.stream (name: 'stream name' );
0 commit comments