@@ -5,7 +5,9 @@ import 'package:flutter_checks/flutter_checks.dart';
5
5
import 'package:flutter_test/flutter_test.dart' ;
6
6
import 'package:zulip/api/model/events.dart' ;
7
7
import 'package:zulip/api/model/model.dart' ;
8
+ import 'package:zulip/basic.dart' ;
8
9
import 'package:zulip/model/narrow.dart' ;
10
+ import 'package:zulip/model/store.dart' ;
9
11
import 'package:zulip/widgets/content.dart' ;
10
12
import 'package:zulip/widgets/home.dart' ;
11
13
import 'package:zulip/widgets/icons.dart' ;
@@ -24,6 +26,8 @@ import 'message_list_checks.dart';
24
26
import 'page_checks.dart' ;
25
27
import 'test_app.dart' ;
26
28
29
+ late PerAccountStore store;
30
+
27
31
Future <void > setupPage (WidgetTester tester, {
28
32
required List <DmMessage > dmMessages,
29
33
required List <User > users,
@@ -34,7 +38,7 @@ Future<void> setupPage(WidgetTester tester, {
34
38
addTearDown (testBinding.reset);
35
39
36
40
await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
37
- final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
41
+ store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
38
42
39
43
await store.addUser (eg.selfUser);
40
44
for (final user in users) {
@@ -176,7 +180,7 @@ void main() {
176
180
// TODO(#232): syntax like `check(find(…), findsOneWidget)`
177
181
final widget = tester.widget (find.descendant (
178
182
of: find.byType (RecentDmConversationsItem ),
179
- matching: find.text (expectedText),
183
+ matching: find.textContaining (expectedText),
180
184
));
181
185
if (expectedLines != null ) {
182
186
final renderObject = tester.renderObject <RenderParagraph >(find.byWidget (widget));
@@ -186,6 +190,18 @@ void main() {
186
190
}
187
191
}
188
192
193
+ void checkFindsStatusEmoji (WidgetTester tester, Finder emojiFinder) {
194
+ final statusEmojiFinder = find.ancestor (of: emojiFinder,
195
+ matching: find.byType (UserStatusEmoji ));
196
+ check (statusEmojiFinder).findsOne ();
197
+ check (tester.firstWidget <UserStatusEmoji >(statusEmojiFinder)
198
+ .neverAnimate).isTrue ();
199
+
200
+ final itemFinder = find.ancestor (of: statusEmojiFinder,
201
+ matching: find.byType (RecentDmConversationsItem ));
202
+ check (itemFinder).findsOne ();
203
+ }
204
+
189
205
Future <void > markMessageAsRead (WidgetTester tester, Message message) async {
190
206
final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
191
207
await store.handleEvent (UpdateMessageFlagsAddEvent (
@@ -231,6 +247,33 @@ void main() {
231
247
checkTitle (tester, name, 2 );
232
248
});
233
249
250
+ group ('User status' , () {
251
+ testWidgets ('status emoji & text are set -> emoji is displayed, text is not' , (tester) async {
252
+ final message = eg.dmMessage (from: eg.selfUser, to: []);
253
+ await setupPage (tester, dmMessages: [message], users: []);
254
+ await store.changeUserStatus (eg.selfUser.userId, UserStatusChange (
255
+ text: OptionSome ('Busy' ),
256
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
257
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
258
+ await tester.pump ();
259
+
260
+ checkFindsStatusEmoji (tester, find.text ('\u {1f6e0}' ));
261
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
262
+ matching: find.text ('Busy' ))).findsNothing ();
263
+ });
264
+
265
+ testWidgets ('status emoji is not set, text is set -> text is not displayed' , (tester) async {
266
+ final message = eg.dmMessage (from: eg.selfUser, to: []);
267
+ await setupPage (tester, dmMessages: [message], users: []);
268
+ await store.changeUserStatus (eg.selfUser.userId, UserStatusChange (
269
+ text: OptionSome ('Busy' ), emoji: OptionNone ()));
270
+ await tester.pump ();
271
+
272
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
273
+ matching: find.text ('Busy' ))).findsNothing ();
274
+ });
275
+ });
276
+
234
277
testWidgets ('unread counts' , (tester) async {
235
278
final message = eg.dmMessage (from: eg.selfUser, to: []);
236
279
await setupPage (tester, users: [], dmMessages: [message]);
@@ -291,6 +334,35 @@ void main() {
291
334
checkTitle (tester, user.fullName, 2 );
292
335
});
293
336
337
+ group ('User status' , () {
338
+ testWidgets ('status emoji & text are set -> emoji is displayed, text is not' , (tester) async {
339
+ final user = eg.user ();
340
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
341
+ await setupPage (tester, users: [user], dmMessages: [message]);
342
+ await store.changeUserStatus (user.userId, UserStatusChange (
343
+ text: OptionSome ('Busy' ),
344
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
345
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
346
+ await tester.pump ();
347
+
348
+ checkFindsStatusEmoji (tester, find.text ('\u {1f6e0}' ));
349
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
350
+ matching: find.text ('Busy' ))).findsNothing ();
351
+ });
352
+
353
+ testWidgets ('status emoji is not set, text is set -> text is not displayed' , (tester) async {
354
+ final user = eg.user ();
355
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
356
+ await setupPage (tester, users: [user], dmMessages: [message]);
357
+ await store.changeUserStatus (user.userId, UserStatusChange (
358
+ text: OptionSome ('Busy' ), emoji: OptionNone ()));
359
+ await tester.pump ();
360
+
361
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
362
+ matching: find.text ('Busy' ))).findsNothing ();
363
+ });
364
+ });
365
+
294
366
testWidgets ('unread counts' , (tester) async {
295
367
final message = eg.dmMessage (from: eg.otherUser, to: [eg.selfUser]);
296
368
await setupPage (tester, users: [], dmMessages: [message]);
@@ -379,6 +451,22 @@ void main() {
379
451
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 2 );
380
452
});
381
453
454
+ testWidgets ('status emoji & text are set -> none of them is displayed' , (tester) async {
455
+ final users = usersList (4 );
456
+ final message = eg.dmMessage (from: eg.selfUser, to: users);
457
+ await setupPage (tester, users: users, dmMessages: [message]);
458
+ await store.changeUserStatus (users.first.userId, UserStatusChange (
459
+ text: OptionSome ('Busy' ),
460
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
461
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
462
+ await tester.pump ();
463
+
464
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
465
+ matching: find.text ('\u {1f6e0}' ))).findsNothing ();
466
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
467
+ matching: find.text ('Busy' ))).findsNothing ();
468
+ });
469
+
382
470
testWidgets ('unread counts' , (tester) async {
383
471
final message = eg.dmMessage (from: eg.thirdUser, to: [eg.selfUser, eg.otherUser]);
384
472
await setupPage (tester, users: [], dmMessages: [message]);
0 commit comments