@@ -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,26 @@ 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
81
+ => true ,
82
+ _ => false ,
83
+ });
84
+ }
85
+
86
+ void checkUserShown (User user, PerAccountStore store, {required bool expected}) {
87
+ check (find.text (user.fullName).evaluate ().length).equals (expected ? 1 : 0 );
88
+ final avatarFinder =
89
+ findNetworkImage (store.tryResolveUrl (user.avatarUrl! ).toString ());
90
+ check (avatarFinder.evaluate ().length).equals (expected ? 1 : 0 );
91
+ }
92
+
68
93
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' );
94
+ final user1 = eg.user (userId: 1 , fullName: 'User One' , avatarUrl : 'user1.png' );
95
+ final user2 = eg.user (userId: 2 , fullName: 'User Two' , avatarUrl : 'user2.png' );
96
+ final user3 = eg.user (userId: 3 , fullName: 'User Three' , avatarUrl : 'user3.png' );
72
97
final composeInputFinder = await setupToComposeInput (tester, users: [user1, user2, user3]);
73
98
final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
74
99
@@ -77,34 +102,37 @@ void main() {
77
102
await tester.enterText (composeInputFinder, 'hello @user ' );
78
103
await tester.enterText (composeInputFinder, 'hello @user t' );
79
104
await tester.pumpAndSettle (); // async computation; options appear
105
+
80
106
// "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' ) );
107
+ checkUserShown (user1, store, expected : false );
108
+ checkUserShown (user2, store, expected : true );
109
+ checkUserShown (user3, store, expected : true );
84
110
85
111
// Finishing autocomplete updates compose box; causes options to disappear
86
112
await tester.tap (find.text ('User Three' ));
87
113
await tester.pump ();
88
114
check (tester.widget <TextField >(composeInputFinder).controller! .text)
89
115
.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 ( );
116
+ checkUserShown (user1, store, expected : false );
117
+ checkUserShown (user2, store, expected : false );
118
+ checkUserShown (user3, store, expected : false );
93
119
94
120
// Then a new autocomplete intent brings up options again
95
121
// TODO(#226): Remove this extra edit when this bug is fixed.
96
122
await tester.enterText (composeInputFinder, 'hello @user tw' );
97
123
await tester.enterText (composeInputFinder, 'hello @user two' );
98
124
await tester.pumpAndSettle (); // async computation; options appear
99
- tester. widget (find. text ( 'User Two' ) );
125
+ checkUserShown (user2, store, expected : true );
100
126
101
127
// Removing autocomplete intent causes options to disappear
102
128
// TODO(#226): Remove one of these edits when this bug is fixed.
103
129
await tester.enterText (composeInputFinder, '' );
104
130
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 ();
131
+ checkUserShown (user1, store, expected: false );
132
+ checkUserShown (user2, store, expected: false );
133
+ checkUserShown (user3, store, expected: false );
134
+
135
+ debugNetworkImageHttpClientProvider = null ;
108
136
});
109
137
});
110
138
}
0 commit comments