@@ -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,95 @@ 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]);
212
-
213
- checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
214
- checkTitle (tester, user.fullName);
220
+ group ('has right title/avatar' , () {
221
+ testWidgets ('bot recipient -> shows bot icon' , (tester) async {
222
+ final user = eg.user (userId: 1 , isBot: true );
223
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
224
+ await setupPage (tester, users: [user], dmMessages: [message]);
225
+
226
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
227
+ checkTitle (tester, user.fullName);
228
+ checkBotIcon (appears: true );
229
+ });
230
+
231
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
232
+ final user = eg.user (userId: 1 , isBot: false );
233
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
234
+ await setupPage (tester, users: [user], dmMessages: [message]);
235
+
236
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
237
+ checkTitle (tester, user.fullName);
238
+ checkBotIcon (appears: false );
239
+ });
215
240
});
216
241
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
- );
224
-
225
- checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
226
- checkTitle (tester, '(unknown user)' );
242
+ group ('no error when user somehow missing from store.users' , () {
243
+ testWidgets ('bot recipient -> shows no bot icon' , (tester) async {
244
+ final user = eg.user (userId: 1 , isBot: true );
245
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
246
+ await setupPage (tester,
247
+ users: [], // exclude user
248
+ dmMessages: [message],
249
+ );
250
+
251
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
252
+ checkTitle (tester, '(unknown user)' );
253
+ checkBotIcon (appears: false );
254
+ });
255
+
256
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
257
+ final user = eg.user (userId: 1 , isBot: false );
258
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
259
+ await setupPage (tester,
260
+ users: [], // exclude user
261
+ dmMessages: [message],
262
+ );
263
+
264
+ checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
265
+ checkTitle (tester, '(unknown user)' );
266
+ checkBotIcon (appears: false );
267
+ });
227
268
});
228
269
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 );
270
+ group ('short name takes one line' , () {
271
+ testWidgets ('bot recipient -> shows bot icon' , (tester) async {
272
+ final user = eg.user (userId: 1 , fullName: 'Short name' , isBot: true );
273
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
274
+ await setupPage (tester, users: [user], dmMessages: [message]);
275
+ checkTitle (tester, user.fullName, 1 );
276
+ checkBotIcon (appears: true );
277
+ });
278
+
279
+ testWidgets ('non-bot recipient -> shows no bot icon' , (tester) async {
280
+ final user = eg.user (userId: 1 , fullName: 'Short name' , isBot: false );
281
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
282
+ await setupPage (tester, users: [user], dmMessages: [message]);
283
+ checkTitle (tester, user.fullName, 1 );
284
+ checkBotIcon (appears: false );
285
+ });
234
286
});
235
287
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 );
288
+ group ('very long name takes two lines (must be ellipsized)' , () {
289
+ testWidgets ('bot recipient -> shows bot icon' , (WidgetTester tester) async {
290
+ final user = eg.user (userId: 1 , isBot: true , 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' );
291
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
292
+ await setupPage (tester, users: [user], dmMessages: [message]);
293
+ checkTitle (tester, user.fullName, 2 );
294
+ checkBotIcon (appears: true );
295
+ });
296
+
297
+ testWidgets ('non-bot recipient -> shows no bot icon' , (WidgetTester tester) async {
298
+ final user = eg.user (userId: 1 , isBot: false , 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' );
299
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
300
+ await setupPage (tester, users: [user], dmMessages: [message]);
301
+ checkTitle (tester, user.fullName, 2 );
302
+ checkBotIcon (appears: false );
303
+ });
241
304
});
242
305
243
306
testWidgets ('unread counts' , (WidgetTester tester) async {
@@ -251,27 +314,29 @@ void main() {
251
314
});
252
315
253
316
group ('group' , () {
254
- List <User > usersList (int count) {
317
+ List <User > usersList (int count, { bool ? containsBot} ) {
255
318
final result = < User > [];
256
319
for (int i = 0 ; i < count; i++ ) {
257
- result.add (eg.user (userId: i, fullName: 'User ${i .toString ()}' ));
320
+ result.add (eg.user (userId: i, fullName: 'User ${i .toString ()}' ,
321
+ isBot: (containsBot ?? false ) && i == 0 ));
258
322
}
259
323
return result;
260
324
}
261
325
262
326
testWidgets ('has right title/avatar' , (WidgetTester tester) async {
263
- final users = usersList (2 );
327
+ final users = usersList (2 , containsBot : true );
264
328
final user0 = users[0 ];
265
329
final user1 = users[1 ];
266
330
final message = eg.dmMessage (from: eg.selfUser, to: [user0, user1]);
267
331
await setupPage (tester, users: users, dmMessages: [message]);
268
332
269
333
checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
270
334
checkTitle (tester, '${user0 .fullName }, ${user1 .fullName }' );
335
+ checkBotIcon (appears: false );
271
336
});
272
337
273
338
testWidgets ('no error when one user somehow missing from store.users' , (WidgetTester tester) async {
274
- final users = usersList (2 );
339
+ final users = usersList (2 , containsBot : false );
275
340
final user0 = users[0 ];
276
341
final user1 = users[1 ];
277
342
final message = eg.dmMessage (from: eg.selfUser, to: [user0, user1]);
@@ -282,20 +347,23 @@ void main() {
282
347
283
348
checkAvatar (tester, DmNarrow .ofMessage (message, selfUserId: eg.selfUser.userId));
284
349
checkTitle (tester, '${user0 .fullName }, (unknown user)' );
350
+ checkBotIcon (appears: false );
285
351
});
286
352
287
353
testWidgets ('few names takes one line' , (WidgetTester tester) async {
288
- final users = usersList (2 );
354
+ final users = usersList (2 , containsBot : false );
289
355
final message = eg.dmMessage (from: eg.selfUser, to: users);
290
356
await setupPage (tester, users: users, dmMessages: [message]);
291
357
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 1 );
358
+ checkBotIcon (appears: false );
292
359
});
293
360
294
361
testWidgets ('very many names takes two lines (must be ellipsized)' , (WidgetTester tester) async {
295
- final users = usersList (40 );
362
+ final users = usersList (40 , containsBot : true );
296
363
final message = eg.dmMessage (from: eg.selfUser, to: users);
297
364
await setupPage (tester, users: users, dmMessages: [message]);
298
365
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 2 );
366
+ checkBotIcon (appears: false );
299
367
});
300
368
301
369
testWidgets ('unread counts' , (WidgetTester tester) async {
0 commit comments