@@ -1191,6 +1191,128 @@ 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+
1245+ await showsConfirmDialog (tester,
1246+ narrow: CombinedFeedNarrow (),
1247+ messages: [message],
1248+ unreadMsgs: eg.unreadMsgs (channels: [
1249+ UnreadChannelSnapshot (
1250+ streamId: message.streamId,
1251+ topic: message.topic,
1252+ unreadMessageIds: [message.id]),
1253+ ]));
1254+ });
1255+
1256+ testWidgets ('MentionsNarrow: show dialog' , (tester) async {
1257+ final message = eg.streamMessage (flags: [MessageFlag .mentioned]);
1258+
1259+ await showsConfirmDialog (tester,
1260+ narrow: CombinedFeedNarrow (),
1261+ messages: [message],
1262+ unreadMsgs: eg.unreadMsgs (
1263+ mentions: [message.id],
1264+ channels: [
1265+ UnreadChannelSnapshot (
1266+ streamId: message.streamId,
1267+ topic: message.topic,
1268+ unreadMessageIds: [message.id]),
1269+ ]));
1270+ });
1271+
1272+ testWidgets ('ChannelNarrow: show dialog' , (tester) async {
1273+ final message = eg.streamMessage (flags: []);
1274+ await showsConfirmDialog (tester,
1275+ narrow: ChannelNarrow (message.streamId),
1276+ messages: [message],
1277+ unreadMsgs: eg.unreadMsgs (channels: [
1278+ UnreadChannelSnapshot (
1279+ streamId: message.streamId,
1280+ topic: message.topic,
1281+ unreadMessageIds: [message.id]),
1282+ ]));
1283+ });
1284+
1285+ testWidgets ('DmNarrow: do not show dialog' , (tester) async {
1286+ final message = eg.dmMessage (flags: [], from: eg.selfUser, to: [eg.otherUser]);
1287+
1288+ await doesNotShowConfirmDialog (tester,
1289+ narrow: DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId),
1290+ messages: [message],
1291+ unreadMsgs: eg.unreadMsgs (dms: [
1292+ UnreadDmSnapshot (otherUserId: eg.otherUser.userId,
1293+ unreadMessageIds: [message.id])]),
1294+ updateResult: UpdateMessageFlagsForNarrowResult (
1295+ processedCount: 1 , updatedCount: 1 ,
1296+ firstProcessedId: message.id, lastProcessedId: message.id,
1297+ foundOldest: true , foundNewest: true ));
1298+ });
1299+
1300+ testWidgets ('TopicNarrow: do not show dialog' , (tester) async {
1301+ final message = eg.streamMessage (flags: []);
1302+
1303+ await doesNotShowConfirmDialog (tester,
1304+ narrow: TopicNarrow .ofMessage (message),
1305+ messages: [message],
1306+ unreadMsgs: eg.unreadMsgs (channels: [
1307+ UnreadChannelSnapshot (topic: message.topic,
1308+ streamId: message.streamId, unreadMessageIds: [message.id])]),
1309+ updateResult: UpdateMessageFlagsForNarrowResult (
1310+ processedCount: 1 , updatedCount: 1 ,
1311+ firstProcessedId: message.id, lastProcessedId: message.id,
1312+ foundOldest: true , foundNewest: true ));
1313+ });
1314+ });
1315+
11941316 testWidgets ('from read to unread' , (tester) async {
11951317 final message = eg.streamMessage (flags: [MessageFlag .read]);
11961318 await setupMessageListPage (tester, messages: [message]);
0 commit comments