1+ import 'dart:io' ;
2+
13import 'package:checks/checks.dart' ;
24import 'package:flutter/material.dart' ;
35import 'package:flutter_test/flutter_test.dart' ;
6+ import 'package:zulip/api/model/events.dart' ;
47import 'package:zulip/api/model/model.dart' ;
58import 'package:zulip/api/route/messages.dart' ;
69import 'package:zulip/model/narrow.dart' ;
10+ import 'package:zulip/widgets/content.dart' ;
711import 'package:zulip/widgets/message_list.dart' ;
812import 'package:zulip/widgets/sticky_header.dart' ;
913import 'package:zulip/widgets/store.dart' ;
1014
1115import '../api/fake_api.dart' ;
16+ import '../test_images.dart' ;
1217import '../example_data.dart' as eg;
1318import '../model/binding.dart' ;
19+ import '../model/test_store.dart' ;
20+ import 'content_checks.dart' ;
1421
1522Future <void > setupMessageListPage (WidgetTester tester, {
1623 required Narrow narrow,
@@ -25,8 +32,9 @@ Future<void> setupMessageListPage(WidgetTester tester, {
2532 final connection = store.connection as FakeApiConnection ;
2633
2734 // prepare message list data
35+ store.addUser (eg.selfUser);
2836 final List <StreamMessage > messages = List .generate (10 , (index) {
29- return eg.streamMessage (id: index);
37+ return eg.streamMessage (id: index, sender : eg.selfUser );
3038 });
3139 connection.prepare (json: GetMessagesResult (
3240 anchor: messages[0 ].id,
@@ -122,4 +130,51 @@ void main() {
122130 check (scrollController.position.pixels).equals (0 );
123131 });
124132 });
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+ });
125180}
0 commit comments