11import  'package:checks/checks.dart' ;
2- import  'package:flutter/cupertino.dart' ;
32import  'package:flutter/material.dart' ;
4- import  'package:flutter/rendering.dart' ;
53import  'package:flutter_test/flutter_test.dart' ;
64import  'package:zulip/model/store.dart' ;
75import  'package:zulip/widgets/content.dart' ;
6+ import  'package:zulip/widgets/icons.dart' ;
87import  'package:zulip/widgets/store.dart' ;
8+ import  'package:zulip/widgets/theme.dart' ;
99import  'package:zulip/widgets/user.dart' ;
10- 
1110import  '../example_data.dart'  as  eg;
1211import  '../model/binding.dart' ;
1312import  '../model/test_store.dart' ;
1413import  '../stdlib_checks.dart' ;
1514import  '../test_images.dart' ;
15+ import  'test_app.dart' ;
1616
1717void  main () {
1818  TestZulipBinding .ensureInitialized ();
@@ -28,9 +28,17 @@ void main() {
2828      await  store.addUser (user);
2929
3030      prepareBoringImageHttpClient ();
31-       await  tester.pumpWidget (GlobalStoreWidget (
32-         child:  PerAccountStoreWidget (accountId:  eg.selfAccount.id,
33-           child:  AvatarImage (userId:  user.userId, size:  size ??  30 ))));
31+       await  tester.pumpWidget (
32+         MaterialApp (
33+           theme:  ThemeData (extensions:  [
34+             DesignVariables .light,
35+           ]),
36+           home:  GlobalStoreWidget (
37+             child:  PerAccountStoreWidget (accountId:  eg.selfAccount.id,
38+                 child:  AvatarImage (userId:  user.userId, size:  size ??  30 )),
39+           ),
40+         ),
41+       );
3442      await  tester.pump ();
3543      await  tester.pump ();
3644      tester.widget (find.byType (AvatarImage ));
@@ -78,5 +86,86 @@ void main() {
7886      check (await  actualUrl (tester, avatarUrl)).isNull ();
7987      debugNetworkImageHttpClientProvider =  null ;
8088    });
89+ 
90+     testWidgets ('shows placeholder when image URL gives error' , (WidgetTester  tester) async  {
91+       addTearDown (testBinding.reset);
92+       prepareBoringImageHttpClient (success:  false );
93+       await  testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
94+       final  store =  await  testBinding.globalStore.perAccount (eg.selfAccount.id);
95+       final  badUser =  eg.user (avatarUrl:  'https://zulip.com/avatarinvalid.png' );
96+       await  store.addUser (badUser);
97+       await  tester.pumpWidget (
98+           MaterialApp (
99+               theme:  ThemeData (extensions:  [
100+                 DesignVariables .light,
101+               ]),
102+               home:  TestZulipApp (
103+           accountId:  eg.selfAccount.id,
104+           child:  AvatarImage (userId:  badUser.userId, size:  30 ))));
105+       await  tester.pumpAndSettle ();
106+       check (
107+         find.descendant (
108+           of:  find.byType (AvatarImage ),
109+           matching:  find.byIcon (ZulipIcons .person),
110+         ).evaluate ().length
111+       ).equals (1 );
112+       debugNetworkImageHttpClientProvider =  null ;
113+     });
114+ 
115+     testWidgets ('shows placeholder when user avatarUrl is null' , (WidgetTester  tester) async  {
116+       addTearDown (testBinding.reset);
117+       await  testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
118+       final  store =  await  testBinding.globalStore.perAccount (eg.selfAccount.id);
119+ 
120+       final  userWithNoUrl =  eg.user (avatarUrl:  null );
121+       await  store.addUser (userWithNoUrl);
122+ 
123+       await  tester.pumpWidget (
124+         MaterialApp (
125+           theme:  ThemeData (extensions:  [
126+             DesignVariables .light,
127+           ]),
128+           home:  TestZulipApp (
129+             accountId:  eg.selfAccount.id,
130+             child:  AvatarImage (userId:  userWithNoUrl.userId, size:  30 ),
131+           ),
132+         ),
133+       );
134+       await  tester.pumpAndSettle ();
135+ 
136+       check (
137+           find.descendant (
138+             of:  find.byType (AvatarImage ),
139+             matching:  find.byIcon (ZulipIcons .person),
140+           ).evaluate ().length
141+       ).equals (1 );
142+     });
143+ 
144+     testWidgets ('shows placeholder when user is not found' , (WidgetTester  tester) async  {
145+       addTearDown (testBinding.reset);
146+       await  testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
147+ 
148+       const  nonExistentUserId =  9999999 ;
149+ 
150+       await  tester.pumpWidget (
151+         MaterialApp (
152+           theme:  ThemeData (extensions:  [
153+             DesignVariables .light,
154+           ]),
155+           home:  TestZulipApp (
156+             accountId:  eg.selfAccount.id,
157+             child:  AvatarImage (userId:  nonExistentUserId, size:  30 ),
158+           ),
159+         ),
160+       );
161+       await  tester.pumpAndSettle ();
162+ 
163+       check (
164+           find.descendant (
165+             of:  find.byType (AvatarImage ),
166+             matching:  find.byIcon (ZulipIcons .person),
167+           ).evaluate ().length
168+       ).equals (1 );
169+     });
81170  });
82171}
0 commit comments