@@ -5,7 +5,9 @@ import 'package:flutter_checks/flutter_checks.dart';
55import 'package:flutter_test/flutter_test.dart' ;
66import 'package:zulip/api/model/events.dart' ;
77import 'package:zulip/api/model/model.dart' ;
8+ import 'package:zulip/basic.dart' ;
89import 'package:zulip/model/narrow.dart' ;
10+ import 'package:zulip/model/store.dart' ;
911import 'package:zulip/widgets/content.dart' ;
1012import 'package:zulip/widgets/home.dart' ;
1113import 'package:zulip/widgets/icons.dart' ;
@@ -20,10 +22,13 @@ import '../model/binding.dart';
2022import '../model/test_store.dart' ;
2123import '../test_navigation.dart' ;
2224import 'content_checks.dart' ;
25+ import 'finders.dart' ;
2326import 'message_list_checks.dart' ;
2427import 'page_checks.dart' ;
2528import 'test_app.dart' ;
2629
30+ late PerAccountStore store;
31+
2732Future <void > setupPage (WidgetTester tester, {
2833 required List <DmMessage > dmMessages,
2934 required List <User > users,
@@ -36,7 +41,7 @@ Future<void> setupPage(WidgetTester tester, {
3641 selfUser ?? = eg.selfUser;
3742 final selfAccount = eg.account (user: selfUser);
3843 await testBinding.globalStore.add (selfAccount, eg.initialSnapshot ());
39- final store = await testBinding.globalStore.perAccount (selfAccount.id);
44+ store = await testBinding.globalStore.perAccount (selfAccount.id);
4045
4146 await store.addUser (selfUser);
4247 for (final user in users) {
@@ -173,8 +178,9 @@ void main() {
173178 // TODO(#232): syntax like `check(find(…), findsOneWidget)`
174179 final widget = tester.widget (find.descendant (
175180 of: find.byType (RecentDmConversationsItem ),
176- matching: find.text (expectedText),
177- ));
181+ // The title might contain a WidgetSpan (for status emoji); exclude
182+ // the resulting placeholder character from the text to be matched.
183+ matching: findText (expectedText, includePlaceholders: false )));
178184 if (expectedLines != null ) {
179185 final renderObject = tester.renderObject <RenderParagraph >(find.byWidget (widget));
180186 check (renderObject.size.height).equals (
@@ -183,6 +189,16 @@ void main() {
183189 }
184190 }
185191
192+ void checkFindsStatusEmoji (WidgetTester tester, Finder emojiFinder) {
193+ final statusEmojiFinder = find.ancestor (of: emojiFinder,
194+ matching: find.byType (UserStatusEmoji ));
195+ check (statusEmojiFinder).findsOne ();
196+ check (tester.widget <UserStatusEmoji >(statusEmojiFinder)
197+ .neverAnimate).isTrue ();
198+ check (find.ancestor (of: statusEmojiFinder,
199+ matching: find.byType (RecentDmConversationsItem ))).findsOne ();
200+ }
201+
186202 Future <void > markMessageAsRead (WidgetTester tester, Message message) async {
187203 final store = await testBinding.globalStore.perAccount (
188204 testBinding.globalStore.accounts.single.id);
@@ -229,6 +245,31 @@ void main() {
229245 checkTitle (tester, name, 2 );
230246 });
231247
248+ group ('User status' , () {
249+ testWidgets ('emoji & text are set -> emoji is displayed, text is not' , (tester) async {
250+ final message = eg.dmMessage (from: eg.selfUser, to: []);
251+ await setupPage (tester, dmMessages: [message], users: []);
252+ await store.changeUserStatus (eg.selfUser.userId, UserStatusChange (
253+ text: OptionSome ('Busy' ),
254+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
255+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
256+ await tester.pump ();
257+
258+ checkFindsStatusEmoji (tester, find.text ('\u {1f6e0}' ));
259+ check (find.textContaining ('Busy' )).findsNothing ();
260+ });
261+
262+ testWidgets ('emoji is not set, text is set -> text is not displayed' , (tester) async {
263+ final message = eg.dmMessage (from: eg.selfUser, to: []);
264+ await setupPage (tester, dmMessages: [message], users: []);
265+ await store.changeUserStatus (eg.selfUser.userId, UserStatusChange (
266+ text: OptionSome ('Busy' ), emoji: OptionNone ()));
267+ await tester.pump ();
268+
269+ check (find.textContaining ('Busy' )).findsNothing ();
270+ });
271+ });
272+
232273 testWidgets ('unread counts' , (tester) async {
233274 final message = eg.dmMessage (from: eg.selfUser, to: []);
234275 await setupPage (tester, users: [], dmMessages: [message]);
@@ -289,6 +330,33 @@ void main() {
289330 checkTitle (tester, user.fullName, 2 );
290331 });
291332
333+ group ('User status' , () {
334+ testWidgets ('emoji & text are set -> emoji is displayed, text is not' , (tester) async {
335+ final user = eg.user ();
336+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
337+ await setupPage (tester, users: [user], dmMessages: [message]);
338+ await store.changeUserStatus (user.userId, UserStatusChange (
339+ text: OptionSome ('Busy' ),
340+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
341+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
342+ await tester.pump ();
343+
344+ checkFindsStatusEmoji (tester, find.text ('\u {1f6e0}' ));
345+ check (find.textContaining ('Busy' )).findsNothing ();
346+ });
347+
348+ testWidgets ('emoji is not set, text is set -> text is not displayed' , (tester) async {
349+ final user = eg.user ();
350+ final message = eg.dmMessage (from: eg.selfUser, to: [user]);
351+ await setupPage (tester, users: [user], dmMessages: [message]);
352+ await store.changeUserStatus (user.userId, UserStatusChange (
353+ text: OptionSome ('Busy' ), emoji: OptionNone ()));
354+ await tester.pump ();
355+
356+ check (find.textContaining ('Busy' )).findsNothing ();
357+ });
358+ });
359+
292360 testWidgets ('unread counts' , (tester) async {
293361 final message = eg.dmMessage (from: eg.otherUser, to: [eg.selfUser]);
294362 await setupPage (tester, users: [], dmMessages: [message]);
@@ -377,6 +445,20 @@ void main() {
377445 checkTitle (tester, users.map ((u) => u.fullName).join (', ' ), 2 );
378446 });
379447
448+ testWidgets ('status emoji & text are set -> none of them is displayed' , (tester) async {
449+ final users = usersList (4 );
450+ final message = eg.dmMessage (from: eg.selfUser, to: users);
451+ await setupPage (tester, users: users, dmMessages: [message]);
452+ await store.changeUserStatus (users.first.userId, UserStatusChange (
453+ text: OptionSome ('Busy' ),
454+ emoji: OptionSome (StatusEmoji (emojiName: 'working_on_it' ,
455+ emojiCode: '1f6e0' , reactionType: ReactionType .unicodeEmoji))));
456+ await tester.pump ();
457+
458+ check (find.text ('\u {1f6e0}' )).findsNothing ();
459+ check (find.textContaining ('Busy' )).findsNothing ();
460+ });
461+
380462 testWidgets ('unread counts' , (tester) async {
381463 final message = eg.dmMessage (from: eg.thirdUser, to: [eg.selfUser, eg.otherUser]);
382464 await setupPage (tester, users: [], dmMessages: [message]);
0 commit comments