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' ;
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