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