@@ -6,18 +6,25 @@ import 'package:zulip/api/model/model.dart';
6
6
import 'package:zulip/api/route/messages.dart' ;
7
7
import 'package:zulip/model/compose.dart' ;
8
8
import 'package:zulip/model/narrow.dart' ;
9
+ import 'package:zulip/model/store.dart' ;
9
10
import 'package:zulip/widgets/message_list.dart' ;
10
11
import 'package:zulip/widgets/store.dart' ;
11
12
12
13
import '../api/fake_api.dart' ;
13
14
import '../example_data.dart' as eg;
14
15
import '../model/binding.dart' ;
15
16
import '../model/test_store.dart' ;
17
+ import 'content_test.dart' ;
16
18
17
19
/// Simulates loading a [MessageListPage] and tapping to focus the compose input.
18
20
///
19
21
/// Also adds [users] to the [PerAccountStore] ,
20
22
/// so they can show up in autocomplete.
23
+ ///
24
+ /// Also sets [debugNetworkImageHttpClientProvider] to return a constant image.
25
+ ///
26
+ /// The caller must set [debugNetworkImageHttpClientProvider] back to null
27
+ /// before the end of the test.
21
28
Future <Finder > setupToComposeInput (WidgetTester tester, {
22
29
required List <User > users,
23
30
}) async {
@@ -39,6 +46,8 @@ Future<Finder> setupToComposeInput(WidgetTester tester, {
39
46
messages: [message],
40
47
).toJson ());
41
48
49
+ prepareBoringImageHttpClient ();
50
+
42
51
await tester.pumpWidget (
43
52
MaterialApp (
44
53
localizationsDelegates: ZulipLocalizations .localizationsDelegates,
@@ -65,10 +74,25 @@ void main() {
65
74
TestZulipBinding .ensureInitialized ();
66
75
67
76
group ('ComposeAutocomplete' , () {
77
+
78
+ Finder findNetworkImage (String url) {
79
+ return find.byWidgetPredicate ((widget) => switch (widget) {
80
+ Image (image: NetworkImage (url: var imageUrl)) when imageUrl == url => true ,
81
+ _ => false ,
82
+ });
83
+ }
84
+
85
+ void checkUserShown (User user, PerAccountStore store, {required bool expected}) {
86
+ check (find.text (user.fullName).evaluate ().length).equals (expected ? 1 : 0 );
87
+ final avatarFinder =
88
+ findNetworkImage (store.tryResolveUrl (user.avatarUrl! ).toString ());
89
+ check (avatarFinder.evaluate ().length).equals (expected ? 1 : 0 );
90
+ }
91
+
68
92
testWidgets ('options appear, disappear, and change correctly' , (WidgetTester tester) async {
69
- final user1 = eg.user (userId: 1 , fullName: 'User One' );
70
- final user2 = eg.user (userId: 2 , fullName: 'User Two' );
71
- final user3 = eg.user (userId: 3 , fullName: 'User Three' );
93
+ final user1 = eg.user (userId: 1 , fullName: 'User One' , avatarUrl : 'user1.png' );
94
+ final user2 = eg.user (userId: 2 , fullName: 'User Two' , avatarUrl : 'user2.png' );
95
+ final user3 = eg.user (userId: 3 , fullName: 'User Three' , avatarUrl : 'user3.png' );
72
96
final composeInputFinder = await setupToComposeInput (tester, users: [user1, user2, user3]);
73
97
final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
74
98
@@ -77,34 +101,37 @@ void main() {
77
101
await tester.enterText (composeInputFinder, 'hello @user ' );
78
102
await tester.enterText (composeInputFinder, 'hello @user t' );
79
103
await tester.pumpAndSettle (); // async computation; options appear
104
+
80
105
// "User Two" and "User Three" appear, but not "User One"
81
- check (tester. widgetList (find. text ( 'User One' ))). isEmpty ( );
82
- tester. widget (find. text ( 'User Two' ) );
83
- tester. widget (find. text ( 'User Three' ) );
106
+ checkUserShown (user1, store, expected : false );
107
+ checkUserShown (user2, store, expected : true );
108
+ checkUserShown (user3, store, expected : true );
84
109
85
110
// Finishing autocomplete updates compose box; causes options to disappear
86
111
await tester.tap (find.text ('User Three' ));
87
112
await tester.pump ();
88
113
check (tester.widget <TextField >(composeInputFinder).controller! .text)
89
114
.contains (mention (user3, users: store.users));
90
- check (tester. widgetList (find. text ( 'User One' ))). isEmpty ( );
91
- check (tester. widgetList (find. text ( 'User Two' ))). isEmpty ( );
92
- check (tester. widgetList (find. text ( 'User Three' ))). isEmpty ( );
115
+ checkUserShown (user1, store, expected : false );
116
+ checkUserShown (user2, store, expected : false );
117
+ checkUserShown (user3, store, expected : false );
93
118
94
119
// Then a new autocomplete intent brings up options again
95
120
// TODO(#226): Remove this extra edit when this bug is fixed.
96
121
await tester.enterText (composeInputFinder, 'hello @user tw' );
97
122
await tester.enterText (composeInputFinder, 'hello @user two' );
98
123
await tester.pumpAndSettle (); // async computation; options appear
99
- tester. widget (find. text ( 'User Two' ) );
124
+ checkUserShown (user2, store, expected : true );
100
125
101
126
// Removing autocomplete intent causes options to disappear
102
127
// TODO(#226): Remove one of these edits when this bug is fixed.
103
128
await tester.enterText (composeInputFinder, '' );
104
129
await tester.enterText (composeInputFinder, ' ' );
105
- check (tester.widgetList (find.text ('User One' ))).isEmpty ();
106
- check (tester.widgetList (find.text ('User Two' ))).isEmpty ();
107
- check (tester.widgetList (find.text ('User Three' ))).isEmpty ();
130
+ checkUserShown (user1, store, expected: false );
131
+ checkUserShown (user2, store, expected: false );
132
+ checkUserShown (user3, store, expected: false );
133
+
134
+ debugNetworkImageHttpClientProvider = null ;
108
135
});
109
136
});
110
137
}
0 commit comments