@@ -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 (
@@ -385,6 +387,65 @@ void main() {
385
387
});
386
388
});
387
389
390
+ group ('MarkAsUnread' , () {
391
+ testWidgets ('not visible if message is not read' , (WidgetTester tester) async {
392
+ final unreadMessage = eg.streamMessage (flags: []);
393
+ await setupToMessageActionSheet (tester, message: unreadMessage, narrow: TopicNarrow .ofMessage (unreadMessage));
394
+
395
+ check (find.byIcon (Icons .mark_chat_unread_outlined).evaluate ()).isEmpty ();
396
+ });
397
+
398
+ testWidgets ('visible if message is read' , (WidgetTester tester) async {
399
+ final readMessage = eg.streamMessage (flags: [MessageFlag .read]);
400
+ await setupToMessageActionSheet (tester, message: readMessage, narrow: TopicNarrow .ofMessage (readMessage));
401
+
402
+ check (find.byIcon (Icons .mark_chat_unread_outlined).evaluate ()).single;
403
+ });
404
+
405
+ group ('onPressed' , () {
406
+ testWidgets ('smoke test' , (WidgetTester tester) async {
407
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
408
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
409
+
410
+ connection.prepare (json: UpdateMessageFlagsForNarrowResult (
411
+ processedCount: 11 , updatedCount: 3 ,
412
+ firstProcessedId: 1 , lastProcessedId: 1980 ,
413
+ foundOldest: true , foundNewest: true ).toJson ());
414
+
415
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
416
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
417
+ await tester.pumpAndSettle ();
418
+ check (connection.lastRequest).isA< http.Request > ()
419
+ ..method.equals ('POST' )
420
+ ..url.path.equals ('/api/v1/messages/flags/narrow' )
421
+ ..bodyFields.deepEquals ({
422
+ 'anchor' : '${message .id }' ,
423
+ 'include_anchor' : 'true' ,
424
+ 'num_before' : '0' ,
425
+ 'num_after' : '1000' ,
426
+ 'narrow' : jsonEncode (TopicNarrow .ofMessage (message).apiEncode ()),
427
+ 'op' : 'remove' ,
428
+ 'flag' : 'read' ,
429
+ });
430
+ });
431
+
432
+ testWidgets ('shows error when fails' , (WidgetTester tester) async {
433
+ final message = eg.streamMessage (flags: [MessageFlag .read]);
434
+ await setupToMessageActionSheet (tester, message: message, narrow: TopicNarrow .ofMessage (message));
435
+
436
+ connection.prepare (exception: http.ClientException ('Oops' ));
437
+ final zulipLocalizations = GlobalLocalizations .zulipLocalizations;
438
+
439
+ await tester.ensureVisible (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
440
+ await tester.tap (find.byIcon (Icons .mark_chat_unread_outlined, skipOffstage: false ));
441
+ await tester.pumpAndSettle ();
442
+ checkErrorDialog (tester,
443
+ expectedTitle: zulipLocalizations.errorMarkAsUnreadFailedTitle,
444
+ expectedMessage: 'NetworkException: Oops (ClientException: Oops)' );
445
+ });
446
+ });
447
+ });
448
+
388
449
group ('CopyMessageTextButton' , () {
389
450
setUp (() async {
390
451
TestDefaultBinaryMessengerBinding .instance.defaultBinaryMessenger.setMockMethodCallHandler (
0 commit comments