@@ -13,6 +13,7 @@ import 'package:zulip/model/localizations.dart';
1313import 'package:zulip/model/narrow.dart' ;
1414import 'package:zulip/model/store.dart' ;
1515import 'package:zulip/model/typing_status.dart' ;
16+ import 'package:zulip/widgets/content.dart' ;
1617import 'package:zulip/widgets/message_list.dart' ;
1718
1819import '../api/fake_api.dart' ;
@@ -126,17 +127,22 @@ void main() {
126127 TestZulipBinding .ensureInitialized ();
127128
128129 group ('@-mentions' , () {
129- void checkUserShown (User user, PerAccountStore store, {required bool expected}) {
130+
131+ Finder findAvatarImage (int userId) =>
132+ find.byWidgetPredicate ((widget) => widget is AvatarImage && widget.userId == userId);
133+
134+ void checkUserShown (User user, {required bool expected, bool ? deliveryEmailExpected}) {
135+ deliveryEmailExpected ?? = expected;
130136 check (find.text (user.fullName).evaluate ().length).equals (expected ? 1 : 0 );
131- final avatarFinder =
132- findNetworkImage (store. tryResolveUrl ( user.avatarUrl ! ). toString () );
137+ check (find. text (user.deliveryEmail ?? "" ). evaluate ().length). equals (deliveryEmailExpected ? 1 : 0 );
138+ final avatarFinder = findAvatarImage ( user.userId );
133139 check (avatarFinder.evaluate ().length).equals (expected ? 1 : 0 );
134140 }
135141
136142 testWidgets ('options appear, disappear, and change correctly' , (tester) async {
137- final user1 = eg.user (userId: 1 , fullName: 'User One' , avatarUrl: 'user1.png' );
138- final user2 = eg.user (userId: 2 , fullName: 'User Two' , avatarUrl: 'user2.png' );
139- final user3 = eg.user (userId: 3 , fullName: 'User Three' , avatarUrl: 'user3.png' );
143+ final user1
= eg.
user (userId
: 1 , fullName
: 'User One' , avatarUrl
: 'user1.png' ,deliveryEmail : '[email protected] ' );
144+ final user2
= eg.
user (userId
: 2 , fullName
: 'User Two' , avatarUrl
: 'user2.png' , deliveryEmail : '[email protected] ' );
145+ final user3
= eg.
user (userId
: 3 , fullName
: 'User Three' , avatarUrl
: 'user3.png' , deliveryEmail : '[email protected] ' );
140146 final composeInputFinder = await setupToComposeInput (tester, users: [user1, user2, user3]);
141147 final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
142148
@@ -147,33 +153,54 @@ void main() {
147153 await tester.pumpAndSettle (); // async computation; options appear
148154
149155 // "User Two" and "User Three" appear, but not "User One"
150- checkUserShown (user1, store, expected: false );
151- checkUserShown (user2, store, expected: true );
152- checkUserShown (user3, store, expected: true );
156+ checkUserShown (user1, expected: false );
157+ checkUserShown (user2, expected: true );
158+ checkUserShown (user3, expected: true );
153159
154160 // Finishing autocomplete updates compose box; causes options to disappear
155161 await tester.tap (find.text ('User Three' ));
156162 await tester.pump ();
157163 check (tester.widget <TextField >(composeInputFinder).controller! .text)
158164 .contains (mention (user3, users: store.users));
159- checkUserShown (user1, store, expected: false );
160- checkUserShown (user2, store, expected: false );
161- checkUserShown (user3, store, expected: false );
165+ checkUserShown (user1, expected: false );
166+ checkUserShown (user2, expected: false );
167+ checkUserShown (user3, expected: false );
162168
163169 // Then a new autocomplete intent brings up options again
164170 // TODO(#226): Remove this extra edit when this bug is fixed.
165171 await tester.enterText (composeInputFinder, 'hello @user tw' );
166172 await tester.enterText (composeInputFinder, 'hello @user two' );
167173 await tester.pumpAndSettle (); // async computation; options appear
168- checkUserShown (user2, store, expected: true );
174+ checkUserShown (user2, expected: true );
169175
170176 // Removing autocomplete intent causes options to disappear
171177 // TODO(#226): Remove one of these edits when this bug is fixed.
172178 await tester.enterText (composeInputFinder, '' );
173179 await tester.enterText (composeInputFinder, ' ' );
174- checkUserShown (user1, store, expected: false );
175- checkUserShown (user2, store, expected: false );
176- checkUserShown (user3, store, expected: false );
180+ checkUserShown (user1, expected: false );
181+ checkUserShown (user2, expected: false );
182+ checkUserShown (user3, expected: false );
183+
184+ debugNetworkImageHttpClientProvider = null ;
185+ });
186+
187+ testWidgets ('test delivery email visibility' , (tester) async {
188+ final user2 = eg.user (userId: 2 , fullName: 'User Two' , avatarUrl: 'user2.png' ,);
189+ final user3
= eg.
user (userId
: 3 , fullName
: 'User Three' , avatarUrl
: 'user3.png' , deliveryEmail
: '[email protected] ' );
190+ final composeInputFinder = await setupToComposeInput (tester, users: [user2, user3]);
191+
192+ TypingNotifier .debugEnable = false ;
193+ addTearDown (TypingNotifier .debugReset);
194+
195+ // Options are filtered correctly for query
196+ // TODO(#226): Remove this extra edit when this bug is fixed.
197+ await tester.enterText (composeInputFinder, 'hello @user ' );
198+ await tester.enterText (composeInputFinder, 'hello @user t' );
199+ await tester.pumpAndSettle (); // async computation; options appear
200+
201+ // "User Two"'s delivery email is not visible and "User Three"'s delivery email is visible
202+ checkUserShown (user2, expected: true , deliveryEmailExpected: false );
203+ checkUserShown (user3, expected: true , deliveryEmailExpected: true );
177204
178205 debugNetworkImageHttpClientProvider = null ;
179206 });
0 commit comments