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/image.dart' ;
8- import 'package:zulip/widgets/store .dart' ;
6+ import 'package:zulip/widgets/icons .dart' ;
97import 'package:zulip/widgets/user.dart' ;
108
119import '../example_data.dart' as eg;
1210import '../model/binding.dart' ;
1311import '../model/test_store.dart' ;
1412import '../stdlib_checks.dart' ;
1513import '../test_images.dart' ;
14+ import 'test_app.dart' ;
1615
1716void main () {
1817 TestZulipBinding .ensureInitialized ();
@@ -28,9 +27,12 @@ void main() {
2827 await store.addUser (user);
2928
3029 prepareBoringImageHttpClient ();
31- await tester.pumpWidget (GlobalStoreWidget (
32- child: PerAccountStoreWidget (accountId: eg.selfAccount.id,
33- child: AvatarImage (userId: user.userId, size: size ?? 30 ))));
30+ await tester.pumpWidget (
31+ TestZulipApp (
32+ accountId: eg.selfAccount.id,
33+ child: AvatarImage (userId: user.userId, size: size ?? 30 ),
34+ )
35+ );
3436 await tester.pump ();
3537 await tester.pump ();
3638 tester.widget (find.byType (AvatarImage ));
@@ -78,5 +80,72 @@ void main() {
7880 check (await actualUrl (tester, avatarUrl)).isNull ();
7981 debugNetworkImageHttpClientProvider = null ;
8082 });
83+
84+ testWidgets ('shows placeholder when image URL gives error' , (WidgetTester tester) async {
85+ addTearDown (testBinding.reset);
86+ prepareBoringImageHttpClient (success: false );
87+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
88+ final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
89+ final badUser = eg.user (avatarUrl: 'https://zulip.com/avatarinvalid.png' );
90+ await store.addUser (badUser);
91+ await tester.pumpWidget (
92+ TestZulipApp (
93+ accountId: eg.selfAccount.id,
94+ child: AvatarImage (userId: badUser.userId, size: 30 )));
95+ await tester.pumpAndSettle ();
96+ check (
97+ find.descendant (
98+ of: find.byType (AvatarImage ),
99+ matching: find.byIcon (ZulipIcons .person),
100+ ).evaluate ().length
101+ ).equals (1 );
102+ debugNetworkImageHttpClientProvider = null ;
103+ });
104+
105+ testWidgets ('shows placeholder when user avatarUrl is null' , (WidgetTester tester) async {
106+ addTearDown (testBinding.reset);
107+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
108+ final store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
109+
110+ final userWithNoUrl = eg.user (avatarUrl: null );
111+ await store.addUser (userWithNoUrl);
112+
113+ await tester.pumpWidget (
114+ TestZulipApp (
115+ accountId: eg.selfAccount.id,
116+ child: AvatarImage (userId: userWithNoUrl.userId, size: 30 ),
117+ ),
118+ );
119+ await tester.pumpAndSettle ();
120+
121+ check (
122+ find.descendant (
123+ of: find.byType (AvatarImage ),
124+ matching: find.byIcon (ZulipIcons .person),
125+ ).evaluate ().length
126+ ).equals (1 );
127+ });
128+
129+ testWidgets ('shows placeholder when user is not found' , (WidgetTester tester) async {
130+ addTearDown (testBinding.reset);
131+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
132+
133+ const nonExistentUserId = 9999999 ;
134+
135+ await tester.pumpWidget (
136+ TestZulipApp (
137+ accountId: eg.selfAccount.id,
138+ child: AvatarImage (userId: nonExistentUserId, size: 30 ),
139+ ),
140+ );
141+ await tester.pumpAndSettle ();
142+
143+ check (
144+ find.descendant (
145+ of: find.byType (AvatarImage ),
146+ matching: find.byIcon (ZulipIcons .person),
147+ ).evaluate ().length
148+ ).equals (1 );
149+ });
81150 });
82151}
0 commit comments