Skip to content

Commit 3ed8e3c

Browse files
avatar: Show placeholder on image load error
1 parent 97c936d commit 3ed8e3c

File tree

2 files changed

+31
-32
lines changed

2 files changed

+31
-32
lines changed

test/test_images.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'dart:async';
22
import 'dart:io';
3-
3+
import 'dart:typed_data';
44
import 'package:flutter/widgets.dart';
55
import 'package:flutter_test/flutter_test.dart';
66

@@ -12,15 +12,20 @@ import 'package:flutter_test/flutter_test.dart';
1212
/// before the end of the test.
1313
// TODO(upstream) simplify callers by using addTearDown: https://github.com/flutter/flutter/issues/123189
1414
// See also: https://github.com/flutter/flutter/issues/121917
15-
FakeImageHttpClient prepareBoringImageHttpClient() {
15+
FakeImageHttpClient prepareBoringImageHttpClient({bool success = true}) {
1616
final httpClient = FakeImageHttpClient();
1717
debugNetworkImageHttpClientProvider = () => httpClient;
18-
httpClient.request.response
19-
..statusCode = HttpStatus.ok
20-
..content = kSolidBlueAvatar;
18+
if (success) {
19+
httpClient.request.response
20+
..statusCode = HttpStatus.ok
21+
..content = kSolidBlueAvatar;
22+
} else {
23+
httpClient.request.response
24+
..statusCode = HttpStatus.notFound
25+
..content = Uint8List(0);
26+
}
2127
return httpClient;
2228
}
23-
2429
class FakeImageHttpClient extends Fake implements HttpClient {
2530
final FakeImageHttpClientRequest request = FakeImageHttpClientRequest();
2631

test/widgets/user_test.dart

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
import 'package:checks/checks.dart';
22
import 'package:flutter/cupertino.dart';
33
import 'package:flutter/material.dart';
4-
import 'package:zulip/widgets/icons.dart';
4+
import 'package:flutter/rendering.dart';
55
import 'package:flutter_test/flutter_test.dart';
66
import 'package:zulip/model/store.dart';
77
import 'package:zulip/widgets/content.dart';
8+
import 'package:zulip/widgets/icons.dart';
89
import 'package:zulip/widgets/store.dart';
910
import 'package:zulip/widgets/user.dart';
10-
import 'dart:io';
1111
import '../example_data.dart' as eg;
1212
import '../model/binding.dart';
1313
import '../model/test_store.dart';
1414
import '../stdlib_checks.dart';
1515
import '../test_images.dart';
1616
import 'test_app.dart';
1717

18-
class MockHttpClient extends Fake implements HttpClient {
19-
@override
20-
Future<HttpClientRequest> getUrl(Uri url) async {
21-
throw const SocketException('test error');
22-
}
23-
}
24-
2518
void main() {
2619
TestZulipBinding.ensureInitialized();
2720

@@ -86,25 +79,26 @@ void main() {
8679
check(await actualUrl(tester, avatarUrl)).isNull();
8780
debugNetworkImageHttpClientProvider = null;
8881
});
89-
9082
testWidgets('shows placeholder when image URL gives error', (WidgetTester tester) async {
91-
await HttpOverrides.runZoned(() async {
92-
addTearDown(testBinding.reset);
93-
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
94-
final store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
95-
final user = eg.user(avatarUrl: 'https://zulip.com/avatar.png');
96-
await store.addUser(user);
97-
98-
await tester.pumpWidget(TestZulipApp(
83+
addTearDown(testBinding.reset);
84+
prepareBoringImageHttpClient(success: false);
85+
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
86+
final store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
87+
final badUser = eg.user(avatarUrl: 'https://zulip.com/avatarinvalid.png');
88+
await store.addUser(badUser);
89+
await tester.pumpWidget(TestZulipApp(
90+
child: PerAccountStoreWidget(
9991
accountId: eg.selfAccount.id,
100-
child: AvatarImage(userId: user.userId, size: 32)));
101-
await tester.pump(); // Image provider is created
102-
await tester.pump(); // Image fails to load
103-
expect(find.byIcon(ZulipIcons.person), findsOneWidget);
104-
105-
expect(find.byType(DecoratedBox), findsOneWidget);
106-
107-
}, createHttpClient: (context) => MockHttpClient());
92+
child: AvatarImage(userId: badUser.userId, size: 30))));
93+
await tester.pumpAndSettle();
94+
expect(
95+
find.descendant(
96+
of: find.byType(AvatarImage),
97+
matching: find.byIcon(ZulipIcons.person),
98+
),
99+
findsOneWidget,
100+
);
101+
debugNetworkImageHttpClientProvider = null;
108102
});
109103
});
110104
}

0 commit comments

Comments
 (0)