@@ -2,12 +2,17 @@ import 'package:checks/checks.dart';
22import 'package:flutter/widgets.dart' ;
33import 'package:flutter_test/flutter_test.dart' ;
44import 'package:zulip/api/core.dart' ;
5+ import 'package:zulip/api/model/initial_snapshot.dart' ;
6+ import 'package:zulip/model/content.dart' ;
7+ import 'package:zulip/model/store.dart' ;
58import 'package:zulip/widgets/image.dart' ;
69import 'package:zulip/widgets/store.dart' ;
710
811import '../example_data.dart' as eg;
912import '../model/binding.dart' ;
13+ import '../model/test_store.dart' ;
1014import '../test_images.dart' ;
15+ import 'test_app.dart' ;
1116
1217void main () {
1318 TestZulipBinding .ensureInitialized ();
@@ -51,4 +56,97 @@ void main() {
5156 check (tester.takeException ()).isA <AssertionError >();
5257 });
5358 });
59+
60+ group ('ImageThumbnailLocator.resolve' , () {
61+ late PerAccountStore store;
62+
63+ Future <void > prepare (WidgetTester tester) async {
64+ addTearDown (testBinding.reset);
65+
66+ final exampleFormats = [
67+ ThumbnailFormat (name: '840x560.webp' ,
68+ maxWidth: 840 , maxHeight: 560 , animated: false , format: 'webp' ),
69+ ThumbnailFormat (name: '840x560-anim.webp' ,
70+ maxWidth: 840 , maxHeight: 560 , animated: true , format: 'webp' ),
71+ ThumbnailFormat (name: '500x900.jpg' ,
72+ maxWidth: 500 , maxHeight: 900 , animated: false , format: 'jpg' ),
73+ ThumbnailFormat (name: '500x900-anim.jpg' ,
74+ maxWidth: 500 , maxHeight: 900 , animated: true , format: 'jpg' ),
75+ ThumbnailFormat (name: '1000x1000.webp' ,
76+ maxWidth: 1000 , maxHeight: 1000 , animated: false , format: 'webp' ),
77+ ThumbnailFormat (name: '1000x2000-anim.png' ,
78+ maxWidth: 1000 , maxHeight: 2000 , animated: true , format: 'png' ),
79+ ThumbnailFormat (name: '1000x1000-anim.webp' ,
80+ maxWidth: 1000 , maxHeight: 1000 , animated: true , format: 'webp' ),
81+ ThumbnailFormat (name: '1000x2000.png' ,
82+ maxWidth: 1000 , maxHeight: 2000 , animated: false , format: 'png' ),
83+ ];
84+
85+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot (
86+ serverThumbnailFormats: exampleFormats,
87+ ));
88+
89+ store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
90+ await store.addUser (eg.selfUser);
91+
92+ await tester.pumpWidget (TestZulipApp (accountId: eg.selfAccount.id));
93+ await tester.pump ();
94+ }
95+
96+ void doCheck (
97+ WidgetTester tester,
98+ int width,
99+ int height,
100+ bool animatedIfSupported,
101+ String expected, {
102+ required bool hasAnimatedVersion,
103+ }) {
104+ final locator = ImageThumbnailLocator (
105+ urlPath: '/user_uploads/thumbnail/1/2/a/pic.jpg/840x560.webp' ,
106+ hasAnimatedVersion: hasAnimatedVersion,
107+ );
108+
109+ final context = tester.element (find.byType (Placeholder ));
110+ final result = locator.resolve (context,
111+ width: width, height: height,
112+ animationMode: animatedIfSupported
113+ ? ImageAnimationMode .animateAlways
114+ : ImageAnimationMode .animateNever);
115+ check (result.toString ()).equals (expected);
116+ }
117+
118+ testWidgets ('animated version exists' , (tester) async {
119+ await prepare (tester);
120+
121+ doCheck (tester, 400 , 400 , false , hasAnimatedVersion: true ,
122+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900.jpg' );
123+ doCheck (tester, 500 , 900 , true , hasAnimatedVersion: true ,
124+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900-anim.jpg' );
125+ doCheck (tester, 500 , 900 , false , hasAnimatedVersion: true ,
126+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900.jpg' );
127+ doCheck (tester, 600 , 500 , true , hasAnimatedVersion: true ,
128+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/840x560-anim.webp' );
129+ doCheck (tester, 600 , 500 , false , hasAnimatedVersion: true ,
130+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/840x560.webp' );
131+ doCheck (tester, 1500 , 2000 , false , hasAnimatedVersion: true ,
132+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/1000x2000.png' );
133+ });
134+
135+ testWidgets ('animated version does not exist' , (tester) async {
136+ await prepare (tester);
137+
138+ doCheck (tester, 400 , 400 , false , hasAnimatedVersion: false ,
139+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900.jpg' );
140+ doCheck (tester, 500 , 900 , true , hasAnimatedVersion: false ,
141+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900.jpg' );
142+ doCheck (tester, 500 , 900 , false , hasAnimatedVersion: false ,
143+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/500x900.jpg' );
144+ doCheck (tester, 600 , 500 , true , hasAnimatedVersion: false ,
145+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/840x560.webp' );
146+ doCheck (tester, 600 , 500 , false , hasAnimatedVersion: false ,
147+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/840x560.webp' );
148+ doCheck (tester, 1500 , 2000 , false , hasAnimatedVersion: false ,
149+ 'https://chat.example/user_uploads/thumbnail/1/2/a/pic.jpg/1000x2000.png' );
150+ });
151+ });
54152}
0 commit comments