@@ -31,6 +31,8 @@ import 'compose_box_checks.dart';
31
31
import 'dialog_checks.dart' ;
32
32
import 'test_app.dart' ;
33
33
34
+ late FakeApiConnection connection;
35
+
34
36
/// Simulates loading a [MessageListPage] and long-pressing on [message] .
35
37
Future <void > setupToMessageActionSheet (WidgetTester tester, {
36
38
required Message message,
@@ -46,7 +48,7 @@ Future<void> setupToMessageActionSheet(WidgetTester tester, {
46
48
await store.addStream (stream);
47
49
await store.addSubscription (eg.subscription (stream));
48
50
}
49
- final connection = store.connection as FakeApiConnection ;
51
+ connection = store.connection as FakeApiConnection ;
50
52
51
53
// prepare message list data
52
54
connection.prepare (json: GetMessagesResult (
@@ -542,4 +544,61 @@ void main() {
542
544
check (mockSharePlus.sharedString).isNull ();
543
545
});
544
546
});
547
+
548
+ group ('MarkAsUnread' , () {
549
+ testWidgets ('not visible if message is not read' , (WidgetTester tester) async {
550
+ final unreadMessage = eg.streamMessage (flags: []);
551
+ await setupToMessageActionSheet (tester, message: unreadMessage, narrow: TopicNarrow .ofMessage (unreadMessage));
552
+
553
+ check (find.byIcon (Icons .mark_chat_unread_outlined).evaluate ()).isEmpty ();
554
+ });
555
+
556
+ testWidgets ('visible if message is read' , (WidgetTester tester) async {
557
+ final readMessage = eg.streamMessage (flags: [MessageFlag .read]);
558
+ await setupToMessageActionSheet (tester, message: readMessage, narrow: TopicNarrow .ofMessage (readMessage));
559
+
560
+ check (find.byIcon (Icons .mark_chat_unread_outlined).evaluate ()).single;
561
+ });
562
+
563
+ testWidgets ('onPressed' , (WidgetTester tester) async {
564
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
565
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
566
+
567
+ connection.prepare (json: UpdateMessageFlagsForNarrowResult (
568
+ processedCount: 11 , updatedCount: 3 ,
569
+ firstProcessedId: 1 , lastProcessedId: 1980 ,
570
+ foundOldest: true , foundNewest: true ).toJson ());
571
+
572
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
573
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
574
+ await tester.pumpAndSettle ();
575
+ check (connection.lastRequest).isA< http.Request > ()
576
+ ..method.equals ('POST' )
577
+ ..url.path.equals ('/api/v1/messages/flags/narrow' )
578
+ ..bodyFields.deepEquals ({
579
+ 'anchor' : '${message .id }' ,
580
+ 'include_anchor' : 'true' ,
581
+ 'num_before' : '0' ,
582
+ 'num_after' : '1000' ,
583
+ 'narrow' : jsonEncode (TopicNarrow .ofMessage (message).apiEncode ()),
584
+ 'op' : 'remove' ,
585
+ 'flag' : 'read' ,
586
+ });
587
+ });
588
+
589
+ testWidgets ('onPressed shows error when fails' , (WidgetTester tester) async {
590
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
591
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
592
+
593
+ connection.prepare (exception: http.ClientException ('Oops' ));
594
+ final zulipLocalizations = GlobalLocalizations .zulipLocalizations;
595
+
596
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
597
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
598
+ await tester.pumpAndSettle ();
599
+ checkErrorDialog (tester,
600
+ expectedTitle: zulipLocalizations.errorMarkAsUnreadFailedTitle,
601
+ expectedMessage: 'NetworkException: Oops (ClientException: Oops)' );
602
+ });
603
+ });
545
604
}
0 commit comments