@@ -262,6 +262,102 @@ void main() {
262
262
tester.widget (find.text (r'\lambda' ));
263
263
});
264
264
265
+ group ('MessageImages' , () {
266
+ final message = eg.streamMessage ();
267
+
268
+ Future <void > prepareContent (WidgetTester tester, String html) async {
269
+ addTearDown (testBinding.reset);
270
+
271
+ await testBinding.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
272
+ final httpClient = FakeImageHttpClient ();
273
+
274
+ debugNetworkImageHttpClientProvider = () => httpClient;
275
+ httpClient.request.response
276
+ ..statusCode = HttpStatus .ok
277
+ ..content = kSolidBlueAvatar;
278
+
279
+ await tester.pumpWidget (
280
+ MaterialApp (
281
+ home: Directionality (
282
+ textDirection: TextDirection .ltr,
283
+ child: GlobalStoreWidget (
284
+ child: PerAccountStoreWidget (
285
+ accountId: eg.selfAccount.id,
286
+ child: MessageContent (
287
+ message: message,
288
+ content: parseContent (html)))))));
289
+ await tester.pump (); // global store
290
+ await tester.pump (); // per-account store
291
+ debugNetworkImageHttpClientProvider = null ;
292
+ }
293
+
294
+ testWidgets ('single image' , (tester) async {
295
+ // "https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3"
296
+ await prepareContent (tester,
297
+ '<div class="message_inline_image">'
298
+ '<a href="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3">'
299
+ '<img src="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3"></a></div>' );
300
+ tester.widget (find.byType (RealmContentNetworkImage ));
301
+ final images = tester.widgetList <RealmContentNetworkImage >(find.byType (RealmContentNetworkImage ));
302
+ check (images.map ((i) => i.src.toString ()).toList ())
303
+ .deepEquals ([
304
+ 'https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3'
305
+ ]);
306
+ });
307
+
308
+ testWidgets ('parse multiple images' , (tester) async {
309
+ // "https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3\nhttps://chat.zulip.org/user_avatars/2/realm/icon.png?version=4"
310
+ await prepareContent (tester,
311
+ '<p>'
312
+ '<a href="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3">https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3</a><br>\n '
313
+ '<a href="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=4">https://chat.zulip.org/user_avatars/2/realm/icon.png?version=4</a></p>\n '
314
+ '<div class="message_inline_image">'
315
+ '<a href="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=3">'
316
+ '<img src="https://uploads.zulipusercontent.net/f535ba07f95b99a83aa48e44fd62bbb6c6cf6615/68747470733a2f2f636861742e7a756c69702e6f72672f757365725f617661746172732f322f7265616c6d2f69636f6e2e706e673f76657273696f6e3d33"></a></div>'
317
+ '<div class="message_inline_image">'
318
+ '<a href="https://chat.zulip.org/user_avatars/2/realm/icon.png?version=4">'
319
+ '<img src="https://uploads.zulipusercontent.net/8f63bc2632a0e41be3f457d86c077e61b4a03e7e/68747470733a2f2f636861742e7a756c69702e6f72672f757365725f617661746172732f322f7265616c6d2f69636f6e2e706e673f76657273696f6e3d34"></a></div>' );
320
+ final images = tester.widgetList <RealmContentNetworkImage >(find.byType (RealmContentNetworkImage ));
321
+ check (images.map ((i) => i.src.toString ()).toList ())
322
+ .deepEquals ([
323
+ 'https://uploads.zulipusercontent.net/f535ba07f95b99a83aa48e44fd62bbb6c6cf6615/68747470733a2f2f636861742e7a756c69702e6f72672f757365725f617661746172732f322f7265616c6d2f69636f6e2e706e673f76657273696f6e3d33' ,
324
+ 'https://uploads.zulipusercontent.net/8f63bc2632a0e41be3f457d86c077e61b4a03e7e/68747470733a2f2f636861742e7a756c69702e6f72672f757365725f617661746172732f322f7265616c6d2f69636f6e2e706e673f76657273696f6e3d34' ,
325
+ ]);
326
+ });
327
+
328
+ testWidgets ('multiple cluster of images' , (tester) async {
329
+ // "https://en.wikipedia.org/static/images/icons/wikipedia.png\nhttps://en.wikipedia.org/static/images/icons/wikipedia.png?v=1\n\nTest\n\nhttps://en.wikipedia.org/static/images/icons/wikipedia.png?v=2\nhttps://en.wikipedia.org/static/images/icons/wikipedia.png?v=3"
330
+ await prepareContent (tester,
331
+ '<p>'
332
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png">https://en.wikipedia.org/static/images/icons/wikipedia.png</a><br>\n '
333
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=1">https://en.wikipedia.org/static/images/icons/wikipedia.png?v=1</a></p>\n '
334
+ '<div class="message_inline_image">'
335
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png">'
336
+ '<img src="https://uploads.zulipusercontent.net/34b2695ca83af76204b0b25a8f2019ee35ec38fa/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e67"></a></div>'
337
+ '<div class="message_inline_image">'
338
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=1">'
339
+ '<img src="https://uploads.zulipusercontent.net/d200fb112aaccbff9df767373a201fa59601f362/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d31"></a></div>'
340
+ '<p>Test</p>\n '
341
+ '<p>'
342
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=2">https://en.wikipedia.org/static/images/icons/wikipedia.png?v=2</a><br>\n '
343
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=3">https://en.wikipedia.org/static/images/icons/wikipedia.png?v=3</a></p>\n '
344
+ '<div class="message_inline_image">'
345
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=2">'
346
+ '<img src="https://uploads.zulipusercontent.net/c4db87e81348dac94eacaa966b46d968b34029cc/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d32"></a></div>'
347
+ '<div class="message_inline_image">'
348
+ '<a href="https://en.wikipedia.org/static/images/icons/wikipedia.png?v=3">'
349
+ '<img src="https://uploads.zulipusercontent.net/51b70540cf6a5b3c8a0b919c893b8abddd447e88/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d33"></a></div>' );
350
+ final images = tester.widgetList <RealmContentNetworkImage >(find.byType (RealmContentNetworkImage ));
351
+ check (images.map ((i) => i.src.toString ()).toList ())
352
+ .deepEquals ([
353
+ 'https://uploads.zulipusercontent.net/34b2695ca83af76204b0b25a8f2019ee35ec38fa/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e67' ,
354
+ 'https://uploads.zulipusercontent.net/d200fb112aaccbff9df767373a201fa59601f362/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d31' ,
355
+ 'https://uploads.zulipusercontent.net/c4db87e81348dac94eacaa966b46d968b34029cc/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d32' ,
356
+ 'https://uploads.zulipusercontent.net/51b70540cf6a5b3c8a0b919c893b8abddd447e88/68747470733a2f2f656e2e77696b6970656469612e6f72672f7374617469632f696d616765732f69636f6e732f77696b6970656469612e706e673f763d33' ,
357
+ ]);
358
+ });
359
+ });
360
+
265
361
group ('RealmContentNetworkImage' , () {
266
362
final authHeaders = authHeader (email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey);
267
363
0 commit comments