1
+ import 'dart:io' ;
2
+
1
3
import 'package:checks/checks.dart' ;
2
4
import 'package:flutter/material.dart' ;
3
5
import 'package:flutter_test/flutter_test.dart' ;
6
+ import 'package:zulip/api/model/events.dart' ;
4
7
import 'package:zulip/api/model/model.dart' ;
5
8
import 'package:zulip/api/route/messages.dart' ;
6
9
import 'package:zulip/model/narrow.dart' ;
10
+ import 'package:zulip/widgets/content.dart' ;
7
11
import 'package:zulip/widgets/message_list.dart' ;
8
12
import 'package:zulip/widgets/sticky_header.dart' ;
9
13
import 'package:zulip/widgets/store.dart' ;
10
14
11
15
import '../api/fake_api.dart' ;
16
+ import '../test_images.dart' ;
12
17
import '../example_data.dart' as eg;
13
18
import '../model/binding.dart' ;
19
+ import '../model/test_store.dart' ;
20
+ import 'content_checks.dart' ;
14
21
15
22
Future <void > setupMessageListPage (WidgetTester tester, {
16
23
required Narrow narrow,
@@ -25,8 +32,9 @@ Future<void> setupMessageListPage(WidgetTester tester, {
25
32
final connection = store.connection as FakeApiConnection ;
26
33
27
34
// prepare message list data
35
+ store.addUser (eg.selfUser);
28
36
final List <StreamMessage > messages = List .generate (10 , (index) {
29
- return eg.streamMessage (id: index);
37
+ return eg.streamMessage (id: index, sender : eg.selfUser );
30
38
});
31
39
connection.prepare (json: GetMessagesResult (
32
40
anchor: messages[0 ].id,
@@ -122,4 +130,51 @@ void main() {
122
130
check (scrollController.position.pixels).equals (0 );
123
131
});
124
132
});
133
+
134
+ group ('MessageWithSender' , () {
135
+ testWidgets ('Updates avatar on RealmUserUpdateEvent' , (tester) async {
136
+ addTearDown (TestZulipBinding .instance.reset);
137
+
138
+ // TODO recognize avatar more reliably:
139
+ // https://github.com/zulip/zulip-flutter/pull/246#discussion_r1282516308
140
+ RealmContentNetworkImage ? findAvatarImageWidget (WidgetTester tester) {
141
+ return tester.widgetList <RealmContentNetworkImage >(
142
+ find.descendant (
143
+ of: find.byType (MessageWithSender ),
144
+ matching: find.byType (RealmContentNetworkImage ))).firstOrNull;
145
+ }
146
+
147
+ void checkResultForSender (String ? avatarUrl) {
148
+ if (avatarUrl == null ) {
149
+ check (findAvatarImageWidget (tester)).isNull ();
150
+ } else {
151
+ check (findAvatarImageWidget (tester)).isNotNull ()
152
+ .src.equals (resolveUrl (avatarUrl, eg.selfAccount));
153
+ }
154
+ }
155
+
156
+ Future <void > handleNewAvatarEventAndPump (WidgetTester tester, String avatarUrl) async {
157
+ final store = await TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
158
+ store.handleEvent (RealmUserUpdateEvent (id: 1 , userId: eg.selfUser.userId, avatarUrl: avatarUrl));
159
+ await tester.pump ();
160
+ }
161
+
162
+ final httpClient = FakeImageHttpClient ();
163
+ debugNetworkImageHttpClientProvider = () => httpClient;
164
+ httpClient.request.response
165
+ ..statusCode = HttpStatus .ok
166
+ ..content = kSolidBlueAvatar;
167
+
168
+ await setupMessageListPage (tester, narrow: const AllMessagesNarrow ());
169
+ checkResultForSender (eg.selfUser.avatarUrl);
170
+
171
+ await handleNewAvatarEventAndPump (tester, '/foo.png' );
172
+ checkResultForSender ('/foo.png' );
173
+
174
+ await handleNewAvatarEventAndPump (tester, '/bar.jpg' );
175
+ checkResultForSender ('/bar.jpg' );
176
+
177
+ debugNetworkImageHttpClientProvider = null ;
178
+ });
179
+ });
125
180
}
0 commit comments