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
11- import  '../api/fake_api.dart' ;
15+ import  '../api/fake_api.dart'  as  fake_api;
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,
@@ -22,11 +29,12 @@ Future<void> setupMessageListPage(WidgetTester tester, {
2229
2330  await  TestZulipBinding .instance.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
2431  final  store =  await  TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
25-   final  connection =  store.connection as  FakeApiConnection ;
32+   final  connection =  store.connection as  fake_api. 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,
@@ -51,6 +59,58 @@ Future<void> setupMessageListPage(WidgetTester tester, {
5159void  main () {
5260  TestZulipBinding .ensureInitialized ();
5361
62+   group ('MessageWithSender' , () {
63+     testWidgets ('Updates avatar on RealmUserUpdateEvent' , (tester) async  {
64+       addTearDown (TestZulipBinding .instance.reset);
65+ 
66+       RealmContentNetworkImage ?  findAvatarImageWidget (WidgetTester  tester) {
67+         final  firstMessageWithSender =  tester.widgetList (find.byType (MessageWithSender )).first;
68+         return  tester.widgetList <RealmContentNetworkImage >(
69+           find.descendant (
70+             of:  find.byWidget (firstMessageWithSender),
71+             matching:  find.byType (RealmContentNetworkImage )),
72+         ).singleOrNull;
73+       }
74+ 
75+       void  checkResultForSender (User  sender) {
76+         final  avatarUrl =  sender.avatarUrl;
77+         switch  (avatarUrl) {
78+           case  String ():  {
79+             check (findAvatarImageWidget (tester)).isNotNull ().src.equals (resolveUrl (avatarUrl, eg.selfAccount));
80+           }
81+           case  null :  {
82+             check (findAvatarImageWidget (tester)).isNull ();
83+           }
84+         }
85+       }
86+ 
87+       Future <void > handleNewAvatarEventAndPump (WidgetTester  tester, String  avatarUrl) async  {
88+         final  store =  await  TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
89+         store.handleEvent (RealmUserUpdateEvent (id:  1 , userId:  eg.selfUser.userId, avatarUrl:  avatarUrl));
90+         await  tester.pump ();
91+       }
92+ 
93+       final  httpClient =  FakeHttpClient ();
94+       debugNetworkImageHttpClientProvider =  () =>  httpClient;
95+       httpClient.request.response
96+         ..statusCode =  HttpStatus .ok
97+         ..content =  kSolidBlueAvatar;
98+ 
99+       await  setupMessageListPage (tester, narrow:  const  AllMessagesNarrow ());
100+       checkResultForSender (eg.selfUser);
101+ 
102+       await  handleNewAvatarEventAndPump (tester, '/foo.png' );
103+       // TODO only vary [avatarUrl], not other fields 
104+       checkResultForSender (eg.user (userId:  eg.selfUser.userId, avatarUrl:  '/foo.png' ));
105+ 
106+       await  handleNewAvatarEventAndPump (tester, '/bar.jpg' );
107+       // TODO only vary [avatarUrl], not other fields 
108+       checkResultForSender (eg.user (userId:  eg.selfUser.userId, avatarUrl:  '/bar.jpg' ));
109+ 
110+       debugNetworkImageHttpClientProvider =  null ;
111+     });
112+   });
113+ 
54114  group ('ScrollToBottomButton interactions' , () {
55115    ScrollController ?  findMessageListScrollController (WidgetTester  tester) {
56116      final  stickyHeaderListView =  tester.widget <StickyHeaderListView >(find.byType (StickyHeaderListView ));
0 commit comments