@@ -1191,6 +1191,124 @@ void main() {
11911191 expectedActionButtonText: zulipLocalizations.markAllAsReadConfirmationDialogConfirmButton);
11921192 }
11931193
1194+ group ('confirmation dialog' , () {
1195+ Future <void > showsConfirmDialog (WidgetTester tester, {
1196+ required Narrow narrow,
1197+ required List <Message > messages,
1198+ required UnreadMessagesSnapshot unreadMsgs,
1199+ }) async {
1200+ await setupMessageListPage (tester, narrow: narrow,
1201+ messages: messages, unreadMsgs: unreadMsgs);
1202+ check (isMarkAsReadButtonVisible (tester)).isTrue ();
1203+
1204+ await tester.tap (find.byType (MarkAsReadWidget ));
1205+ await tester.pump ();
1206+
1207+ final unreadCount = store.unreads.countInNarrow (narrow);
1208+ checkConfirmDialog (tester, unreadCount);
1209+ }
1210+
1211+ Future <void > doesNotShowConfirmDialog (WidgetTester tester, {
1212+ required Narrow narrow,
1213+ required List <Message > messages,
1214+ required UnreadMessagesSnapshot unreadMsgs,
1215+ required UpdateMessageFlagsForNarrowResult updateResult,
1216+ }) async {
1217+ await setupMessageListPage (tester,
1218+ narrow: narrow, messages: messages, unreadMsgs: unreadMsgs);
1219+ check (isMarkAsReadButtonVisible (tester)).isTrue ();
1220+
1221+ connection.prepare (json: updateResult.toJson ());
1222+ await tester.tap (find.byType (MarkAsReadWidget ));
1223+ await tester.pump ();
1224+
1225+ checkNoDialog (tester);
1226+ await tester.pump (Duration .zero);
1227+ final apiNarrow = narrow.apiEncode ()..add (ApiNarrowIs (IsOperand .unread));
1228+ check (connection.lastRequest).isA< http.Request > ()
1229+ ..method.equals ('POST' )
1230+ ..url.path.equals ('/api/v1/messages/flags/narrow' )
1231+ ..bodyFields.deepEquals ({
1232+ 'anchor' : 'oldest' ,
1233+ 'include_anchor' : 'false' ,
1234+ 'num_before' : '0' ,
1235+ 'num_after' : '1000' ,
1236+ 'narrow' : jsonEncode (resolveApiNarrowForServer (apiNarrow, connection.zulipFeatureLevel! )),
1237+ 'op' : 'add' ,
1238+ 'flag' : 'read' ,
1239+ });
1240+ }
1241+
1242+ testWidgets ('CombinedFeedNarrow: show dialog' , (tester) async {
1243+ final message = eg.streamMessage (flags: []);
1244+ await showsConfirmDialog (tester,
1245+ narrow: CombinedFeedNarrow (),
1246+ messages: [message],
1247+ unreadMsgs: eg.unreadMsgs (channels: [
1248+ UnreadChannelSnapshot (
1249+ streamId: message.streamId,
1250+ topic: message.topic,
1251+ unreadMessageIds: [message.id]),
1252+ ]));
1253+ });
1254+
1255+ testWidgets ('MentionsNarrow: show dialog' , (tester) async {
1256+ final message = eg.streamMessage (flags: [MessageFlag .mentioned]);
1257+ await showsConfirmDialog (tester,
1258+ narrow: CombinedFeedNarrow (),
1259+ messages: [message],
1260+ unreadMsgs: eg.unreadMsgs (
1261+ mentions: [message.id],
1262+ channels: [
1263+ UnreadChannelSnapshot (
1264+ streamId: message.streamId,
1265+ topic: message.topic,
1266+ unreadMessageIds: [message.id]),
1267+ ]));
1268+ });
1269+
1270+ testWidgets ('ChannelNarrow: show dialog' , (tester) async {
1271+ final message = eg.streamMessage (flags: []);
1272+ await showsConfirmDialog (tester,
1273+ narrow: ChannelNarrow (message.streamId),
1274+ messages: [message],
1275+ unreadMsgs: eg.unreadMsgs (channels: [
1276+ UnreadChannelSnapshot (
1277+ streamId: message.streamId,
1278+ topic: message.topic,
1279+ unreadMessageIds: [message.id]),
1280+ ]));
1281+ });
1282+
1283+ testWidgets ('DmNarrow: do not show dialog' , (tester) async {
1284+ final message = eg.dmMessage (flags: [], from: eg.selfUser, to: [eg.otherUser]);
1285+ await doesNotShowConfirmDialog (tester,
1286+ narrow: DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId),
1287+ messages: [message],
1288+ unreadMsgs: eg.unreadMsgs (dms: [
1289+ UnreadDmSnapshot (otherUserId: eg.otherUser.userId,
1290+ unreadMessageIds: [message.id])]),
1291+ updateResult: UpdateMessageFlagsForNarrowResult (
1292+ processedCount: 1 , updatedCount: 1 ,
1293+ firstProcessedId: message.id, lastProcessedId: message.id,
1294+ foundOldest: true , foundNewest: true ));
1295+ });
1296+
1297+ testWidgets ('TopicNarrow: do not show dialog' , (tester) async {
1298+ final message = eg.streamMessage (flags: []);
1299+ await doesNotShowConfirmDialog (tester,
1300+ narrow: TopicNarrow .ofMessage (message),
1301+ messages: [message],
1302+ unreadMsgs: eg.unreadMsgs (channels: [
1303+ UnreadChannelSnapshot (topic: message.topic,
1304+ streamId: message.streamId, unreadMessageIds: [message.id])]),
1305+ updateResult: UpdateMessageFlagsForNarrowResult (
1306+ processedCount: 1 , updatedCount: 1 ,
1307+ firstProcessedId: message.id, lastProcessedId: message.id,
1308+ foundOldest: true , foundNewest: true ));
1309+ });
1310+ });
1311+
11941312 testWidgets ('from read to unread' , (tester) async {
11951313 final message = eg.streamMessage (flags: [MessageFlag .read]);
11961314 await setupMessageListPage (tester, messages: [message]);
0 commit comments