@@ -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,63 @@ 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
+ group ('onPressed' , () {
564
+ testWidgets ('smoke test' , (WidgetTester tester) async {
565
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
566
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
567
+
568
+ connection.prepare (json: UpdateMessageFlagsForNarrowResult (
569
+ processedCount: 11 , updatedCount: 3 ,
570
+ firstProcessedId: 1 , lastProcessedId: 1980 ,
571
+ foundOldest: true , foundNewest: true ).toJson ());
572
+
573
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
574
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
575
+ await tester.pumpAndSettle ();
576
+ check (connection.lastRequest).isA< http.Request > ()
577
+ ..method.equals ('POST' )
578
+ ..url.path.equals ('/api/v1/messages/flags/narrow' )
579
+ ..bodyFields.deepEquals ({
580
+ 'anchor' : '${message .id }' ,
581
+ 'include_anchor' : 'true' ,
582
+ 'num_before' : '0' ,
583
+ 'num_after' : '1000' ,
584
+ 'narrow' : jsonEncode (TopicNarrow .ofMessage (message).apiEncode ()),
585
+ 'op' : 'remove' ,
586
+ 'flag' : 'read' ,
587
+ });
588
+ });
589
+
590
+ testWidgets ('shows error when fails' , (WidgetTester tester) async {
591
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
592
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
593
+
594
+ connection.prepare (exception: http.ClientException ('Oops' ));
595
+ final zulipLocalizations = GlobalLocalizations .zulipLocalizations;
596
+
597
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
598
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
599
+ await tester.pumpAndSettle ();
600
+ checkErrorDialog (tester,
601
+ expectedTitle: zulipLocalizations.errorMarkAsUnreadFailedTitle,
602
+ expectedMessage: 'NetworkException: Oops (ClientException: Oops)' );
603
+ });
604
+ });
605
+ });
545
606
}
0 commit comments