@@ -149,6 +149,14 @@ void main() {
149
149
}
150
150
}
151
151
152
+ void checkBotIcon ({required bool appears}) {
153
+ final botFinder = find.descendant (
154
+ of: find.byType (RecentDmConversationsItem ),
155
+ matching: find.byIcon (ZulipIcons .bot));
156
+
157
+ check (botFinder.evaluate ().length).equals (appears ? 1 : 0 );
158
+ }
159
+
152
160
Future <void > markMessageAsRead (WidgetTester tester, Message message) async {
153
161
final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
154
162
await store.handleEvent (UpdateMessageFlagsAddEvent (
@@ -176,6 +184,7 @@ void main() {
176
184
177
185
checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
178
186
checkTitle (tester, eg.selfUser.fullName);
187
+ checkBotIcon (appears: false );
179
188
});
180
189
181
190
testWidgets ('short name takes one line' , (WidgetTester tester) async {
@@ -184,6 +193,7 @@ void main() {
184
193
await setupPage (tester, users: [], dmMessages: [message],
185
194
newNameForSelfUser: name);
186
195
checkTitle (tester, name, 1 );
196
+ checkBotIcon (appears: false );
187
197
});
188
198
189
199
testWidgets ('very long name takes two lines (must be ellipsized)' , (WidgetTester tester) async {
@@ -192,6 +202,7 @@ void main() {
192
202
await setupPage (tester, users: [], dmMessages: [message],
193
203
newNameForSelfUser: name);
194
204
checkTitle (tester, name, 2 );
205
+ checkBotIcon (appears: false );
195
206
});
196
207
197
208
testWidgets ('unread counts' , (WidgetTester tester) async {
@@ -201,43 +212,100 @@ void main() {
201
212
checkUnreadCount (tester, 1 );
202
213
await markMessageAsRead (tester, message);
203
214
checkUnreadCount (tester, 0 );
215
+ checkBotIcon (appears: false );
204
216
});
205
217
});
206
218
207
219
group ('1:1' , () {
208
- testWidgets ('has right title/avatar' , (WidgetTester tester) async {
209
- final user = eg.user (userId: 1 );
210
- final message = eg.dmMessage (from: eg.selfUser, to: [user]);
211
- await setupPage (tester, users: [user], dmMessages: [message]);
220
+ group ('has right title/avatar' , () {
221
+ Future <void > checkRecipient (WidgetTester tester, {
222
+ required bool isBot,
223
+ required bool looksBot
224
+ }) async {
225
+ final user = eg.user (userId: 1 , isBot: isBot);
226
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
227
+ await setupPage (tester, users: [user], dmMessages: [message]);
228
+
229
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
230
+ checkTitle (tester, user.fullName);
231
+ checkBotIcon (appears: looksBot);
232
+ }
212
233
213
- checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
214
- checkTitle (tester, user.fullName);
234
+ testWidgets ('bot recipient -> shows bot icon' , (tester) async {
235
+ await checkRecipient (tester, isBot: true , looksBot: true );
236
+ });
237
+
238
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
239
+ await checkRecipient (tester, isBot: false , looksBot: false );
240
+ });
215
241
});
216
242
217
- testWidgets ('no error when user somehow missing from store.users' , (WidgetTester tester) async {
218
- final user = eg.user (userId: 1 );
219
- final message = eg.dmMessage (from: eg.selfUser, to: [user]);
220
- await setupPage (tester,
221
- users: [], // exclude user
222
- dmMessages: [message],
223
- );
243
+ group ('no error when user somehow missing from store.users' , () {
244
+ Future <void > checkRecipient (WidgetTester tester, {
245
+ required bool isBot,
246
+ required bool looksBot
247
+ }) async {
248
+ final user = eg.user (userId: 1 , isBot: isBot);
249
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
250
+ await setupPage (tester,
251
+ users: [], // exclude user
252
+ dmMessages: [message],
253
+ );
254
+
255
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
256
+ checkTitle (tester, '(unknown user)' );
257
+ checkBotIcon (appears: looksBot);
258
+ }
224
259
225
- checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
226
- checkTitle (tester, '(unknown user)' );
260
+ testWidgets ('bot recipient -> shows no bot icon' , (tester) async {
261
+ await checkRecipient (tester, isBot: true , looksBot: false );
262
+ });
263
+
264
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
265
+ await checkRecipient (tester, isBot: false , looksBot: false );
266
+ });
227
267
});
228
268
229
- testWidgets ('short name takes one line' , (WidgetTester tester) async {
230
- final user = eg.user (userId: 1 , fullName: 'Short name' );
231
- final message = eg.dmMessage (from: eg.selfUser, to: [user]);
232
- await setupPage (tester, users: [user], dmMessages: [message]);
233
- checkTitle (tester, user.fullName, 1 );
269
+ group ('short name takes one line' , () {
270
+ Future <void > checkRecipient (WidgetTester tester, {
271
+ required bool isBot,
272
+ required bool looksBot
273
+ }) async {
274
+ final user = eg.user (userId: 1 , fullName: 'Short name' , isBot: isBot);
275
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
276
+ await setupPage (tester, users: [user], dmMessages: [message]);
277
+ checkTitle (tester, user.fullName, 1 );
278
+ checkBotIcon (appears: looksBot);
279
+ }
280
+
281
+ testWidgets ('bot recipient -> shows bot icon' , (tester) async {
282
+ await checkRecipient (tester, isBot: true , looksBot: true );
283
+ });
284
+
285
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
286
+ await checkRecipient (tester, isBot: false , looksBot: false );
287
+ });
234
288
});
235
289
236
- testWidgets ('very long name takes two lines (must be ellipsized)' , (WidgetTester tester) async {
237
- final user = eg.user (userId: 1 , fullName: 'Long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name' );
238
- final message = eg.dmMessage (from: eg.selfUser, to: [user]);
239
- await setupPage (tester, users: [user], dmMessages: [message]);
240
- checkTitle (tester, user.fullName, 2 );
290
+ group ('very long name takes two lines (must be ellipsized)' , () {
291
+ Future <void > checkRecipient (WidgetTester tester, {
292
+ required bool isBot,
293
+ required bool looksBot
294
+ }) async {
295
+ final user = eg.user (userId: 1 , isBot: isBot, fullName: 'Long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name long name' );
296
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
297
+ await setupPage (tester, users: [user], dmMessages: [message]);
298
+ checkTitle (tester, user.fullName, 2 );
299
+ checkBotIcon (appears: looksBot);
300
+ }
301
+
302
+ testWidgets ('bot recipient -> shows bot icon' , (WidgetTester tester) async {
303
+ await checkRecipient (tester, isBot: true , looksBot: true );
304
+ });
305
+
306
+ testWidgets ('non-bot recipient -> shows no bot icon' , (WidgetTester tester) async {
307
+ await checkRecipient (tester, isBot: false , looksBot: false );
308
+ });
241
309
});
242
310
243
311
testWidgets ('unread counts' , (WidgetTester tester) async {
@@ -251,27 +319,29 @@ void main() {
251
319
});
252
320
253
321
group ('group' , () {
254
- List <User > usersList (int count) {
322
+ List <User > usersList (int count, { bool ? containsBot} ) {
255
323
final result = < User > [];
256
324
for (int i = 0 ; i < count; i++ ) {
257
- result.add (eg.user (userId: i, fullName: 'User ${i .toString ()}' ));
325
+ result.add (eg.user (userId: i, fullName: 'User ${i .toString ()}' ,
326
+ isBot: (containsBot ?? false ) && i == 0 ));
258
327
}
259
328
return result;
260
329
}
261
330
262
331
testWidgets ('has right title/avatar' , (WidgetTester tester) async {
263
- final users = usersList (2 );
332
+ final users = usersList (2 , containsBot : true );
264
333
final user0 = users[0 ];
265
334
final user1 = users[1 ];
266
335
final message = eg.dmMessage (from: eg.selfUser, to: [user0, user1]);
267
336
await setupPage (tester, users: users, dmMessages: [message]);
268
337
269
338
checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
270
339
checkTitle (tester, '${user0 .fullName }, ${user1 .fullName }' );
340
+ checkBotIcon (appears: false );
271
341
});
272
342
273
343
testWidgets ('no error when one user somehow missing from store.users' , (WidgetTester tester) async {
274
- final users = usersList (2 );
344
+ final users = usersList (2 , containsBot : false );
275
345
final user0 = users[0 ];
276
346
final user1 = users[1 ];
277
347
final message = eg.dmMessage (from: eg.selfUser, to: [user0, user1]);
@@ -282,20 +352,23 @@ void main() {
282
352
283
353
checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
284
354
checkTitle (tester, '${user0 .fullName }, (unknown user)' );
355
+ checkBotIcon (appears: false );
285
356
});
286
357
287
358
testWidgets ('few names takes one line' , (WidgetTester tester) async {
288
- final users = usersList (2 );
359
+ final users = usersList (2 , containsBot : false );
289
360
final message = eg.dmMessage (from: eg.selfUser, to: users);
290
361
await setupPage (tester, users: users, dmMessages: [message]);
291
362
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 1 );
363
+ checkBotIcon (appears: false );
292
364
});
293
365
294
366
testWidgets ('very many names takes two lines (must be ellipsized)' , (WidgetTester tester) async {
295
- final users = usersList (40 );
367
+ final users = usersList (40 , containsBot : true );
296
368
final message = eg.dmMessage (from: eg.selfUser, to: users);
297
369
await setupPage (tester, users: users, dmMessages: [message]);
298
370
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 2 );
371
+ checkBotIcon (appears: false );
299
372
});
300
373
301
374
testWidgets ('unread counts' , (WidgetTester tester) async {
0 commit comments