@@ -5,8 +5,11 @@ 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' ;
12
+ import 'package:zulip/widgets/emoji.dart' ;
10
13
import 'package:zulip/widgets/home.dart' ;
11
14
import 'package:zulip/widgets/icons.dart' ;
12
15
import 'package:zulip/widgets/message_list.dart' ;
@@ -24,6 +27,8 @@ import 'message_list_checks.dart';
24
27
import 'page_checks.dart' ;
25
28
import 'test_app.dart' ;
26
29
30
+ late PerAccountStore store;
31
+
27
32
Future <void > setupPage (WidgetTester tester, {
28
33
required List <DmMessage > dmMessages,
29
34
required List <User > users,
@@ -34,7 +39,7 @@ Future<void> setupPage(WidgetTester tester, {
34
39
addTearDown (testBinding.reset);
35
40
36
41
await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
37
- final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
42
+ store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
38
43
39
44
await store.addUser (eg.selfUser);
40
45
for (final user in users) {
@@ -176,7 +181,7 @@ void main() {
176
181
// TODO(#232): syntax like `check(find(…), findsOneWidget)`
177
182
final widget = tester.widget (find.descendant (
178
183
of: find.byType (RecentDmConversationsItem ),
179
- matching: find.text (expectedText),
184
+ matching: find.textContaining (expectedText),
180
185
));
181
186
if (expectedLines != null ) {
182
187
final renderObject = tester.renderObject <RenderParagraph >(find.byWidget (widget));
@@ -186,6 +191,23 @@ void main() {
186
191
}
187
192
}
188
193
194
+ void checkStatusEmoji (WidgetTester tester, {required bool isPresent}) {
195
+ final statusEmojiFinder = find.ancestor (
196
+ of: find.byType (UnicodeEmojiWidget ),
197
+ matching: find.byType (UserStatusEmoji ));
198
+ if (isPresent) {
199
+ check (statusEmojiFinder).findsOne ();
200
+ check (tester.firstWidget <UserStatusEmoji >(statusEmojiFinder)
201
+ .neverAnimate).isTrue ();
202
+
203
+ final itemFinder = find.ancestor (of: statusEmojiFinder,
204
+ matching: find.byType (RecentDmConversationsItem ));
205
+ check (itemFinder).findsOne ();
206
+ } else {
207
+ check (statusEmojiFinder).findsNothing ();
208
+ }
209
+ }
210
+
189
211
Future <void > markMessageAsRead (WidgetTester tester, Message message) async {
190
212
final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
191
213
await store.handleEvent (UpdateMessageFlagsAddEvent (
@@ -231,6 +253,45 @@ void main() {
231
253
checkTitle (tester, name, 2 );
232
254
});
233
255
256
+ group ('User status' , () {
257
+ testWidgets ('status emoji & text are set -> emoji is displayed, text is not' , (tester) async {
258
+ final message = eg.dmMessage (from: eg.selfUser, to: []);
259
+ await setupPage (tester, dmMessages: [message], users: []);
260
+ await store.changeUserStatuses ({
261
+ eg.selfUser.userId: UserStatusChange (
262
+ text: OptionSome ('Busy' ),
263
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
264
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))),
265
+ });
266
+ await tester.pump ();
267
+
268
+ checkStatusEmoji (tester, isPresent: true );
269
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
270
+ matching: find.text ('Busy' ))).findsNothing ();
271
+ });
272
+
273
+ testWidgets ('status emoji is not set, text is set -> none of them is displayed' , (tester) async {
274
+ final message = eg.dmMessage (from: eg.selfUser, to: []);
275
+ await setupPage (tester, dmMessages: [message], users: []);
276
+ await store.changeUserStatuses ({
277
+ eg.selfUser.userId: UserStatusChange (
278
+ text: OptionSome ('Busy' ),
279
+ emoji: OptionNone ()),
280
+ });
281
+ await tester.pump ();
282
+
283
+ checkStatusEmoji (tester, isPresent: false );
284
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
285
+ matching: find.text ('Busy' ))).findsNothing ();
286
+ });
287
+
288
+ testWidgets ('status is not set -> emoji is not displayed' , (tester) async {
289
+ final message = eg.dmMessage (from: eg.selfUser, to: []);
290
+ await setupPage (tester, dmMessages: [message], users: []);
291
+ checkStatusEmoji (tester, isPresent: false );
292
+ });
293
+ });
294
+
234
295
testWidgets ('unread counts' , (tester) async {
235
296
final message = eg.dmMessage (from: eg.selfUser, to: []);
236
297
await setupPage (tester, users: [], dmMessages: [message]);
@@ -291,6 +352,48 @@ void main() {
291
352
checkTitle (tester, user.fullName, 2 );
292
353
});
293
354
355
+ group ('User status' , () {
356
+ testWidgets ('status emoji & text are set -> emoji is displayed, text is not' , (tester) async {
357
+ final user = eg.user ();
358
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
359
+ await setupPage (tester, users: [user], dmMessages: [message]);
360
+ await store.changeUserStatuses ({
361
+ user.userId: UserStatusChange (
362
+ text: OptionSome ('Busy' ),
363
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
364
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))),
365
+ });
366
+ await tester.pump ();
367
+
368
+ checkStatusEmoji (tester, isPresent: true );
369
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
370
+ matching: find.text ('Busy' ))).findsNothing ();
371
+ });
372
+
373
+ testWidgets ('status emoji is not set, text is set -> none of them is displayed' , (tester) async {
374
+ final user = eg.user ();
375
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
376
+ await setupPage (tester, users: [user], dmMessages: [message]);
377
+ await store.changeUserStatuses ({
378
+ user.userId: UserStatusChange (
379
+ text: OptionSome ('Busy' ),
380
+ emoji: OptionNone ()),
381
+ });
382
+ await tester.pump ();
383
+
384
+ checkStatusEmoji (tester, isPresent: false );
385
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
386
+ matching: find.text ('Busy' ))).findsNothing ();
387
+ });
388
+
389
+ testWidgets ('status is not set -> emoji is not displayed' , (tester) async {
390
+ final user = eg.user ();
391
+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
392
+ await setupPage (tester, users: [user], dmMessages: [message]);
393
+ checkStatusEmoji (tester, isPresent: false );
394
+ });
395
+ });
396
+
294
397
testWidgets ('unread counts' , (tester) async {
295
398
final message = eg.dmMessage (from: eg.otherUser, to: [eg.selfUser]);
296
399
await setupPage (tester, users: [], dmMessages: [message]);
@@ -379,6 +482,23 @@ void main() {
379
482
checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 2 );
380
483
});
381
484
485
+ testWidgets ('status emoji & text are set -> none of them is displayed' , (tester) async {
486
+ final users = usersList (4 );
487
+ final message = eg.dmMessage (from: eg.selfUser, to: users);
488
+ await setupPage (tester, users: users, dmMessages: [message]);
489
+ await store.changeUserStatuses ({
490
+ users.first.userId: UserStatusChange (
491
+ text: OptionSome ('Busy' ),
492
+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
493
+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))),
494
+ });
495
+ await tester.pump ();
496
+
497
+ checkStatusEmoji (tester, isPresent: false );
498
+ check (find.descendant (of: find.byType (RecentDmConversationsItem ),
499
+ matching: find.text ('Busy' ))).findsNothing ();
500
+ });
501
+
382
502
testWidgets ('unread counts' , (tester) async {
383
503
final message = eg.dmMessage (from: eg.thirdUser, to: [eg.selfUser, eg.otherUser]);
384
504
await setupPage (tester, users: [], dmMessages: [message]);
0 commit comments