1
+ import 'dart:io' ;
2
+
1
3
import 'package:checks/checks.dart' ;
2
4
import 'package:flutter/material.dart' ;
3
5
import 'package:flutter_test/flutter_test.dart' ;
6
+ import 'package:zulip/api/model/events.dart' ;
4
7
import 'package:zulip/api/model/model.dart' ;
5
8
import 'package:zulip/api/route/messages.dart' ;
6
9
import 'package:zulip/model/narrow.dart' ;
10
+ import 'package:zulip/widgets/content.dart' ;
7
11
import 'package:zulip/widgets/message_list.dart' ;
8
12
import 'package:zulip/widgets/sticky_header.dart' ;
9
13
import 'package:zulip/widgets/store.dart' ;
10
14
11
- import '../api/fake_api.dart' ;
15
+ import '../api/fake_api.dart' as fake_api;
16
+ import '../test_images.dart' ;
12
17
import '../example_data.dart' as eg;
13
18
import '../model/binding.dart' ;
19
+ import '../model/test_store.dart' ;
20
+ import 'content_checks.dart' ;
14
21
15
22
Future <void > setupMessageListPage (WidgetTester tester, {
16
23
required Narrow narrow,
@@ -22,11 +29,12 @@ Future<void> setupMessageListPage(WidgetTester tester, {
22
29
23
30
await TestZulipBinding .instance.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
24
31
final store = await TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
25
- final connection = store.connection as FakeApiConnection ;
32
+ final connection = store.connection as fake_api. FakeApiConnection ;
26
33
27
34
// prepare message list data
35
+ store.addUser (eg.selfUser);
28
36
final List <StreamMessage > messages = List .generate (10 , (index) {
29
- return eg.streamMessage (id: index);
37
+ return eg.streamMessage (id: index, sender : eg.selfUser );
30
38
});
31
39
connection.prepare (json: GetMessagesResult (
32
40
anchor: messages[0 ].id,
@@ -51,6 +59,58 @@ Future<void> setupMessageListPage(WidgetTester tester, {
51
59
void main () {
52
60
TestZulipBinding .ensureInitialized ();
53
61
62
+ group ('MessageWithSender' , () {
63
+ testWidgets ('Updates avatar on RealmUserUpdateEvent' , (tester) async {
64
+ addTearDown (TestZulipBinding .instance.reset);
65
+
66
+ RealmContentNetworkImage ? findAvatarImageWidget (WidgetTester tester) {
67
+ final firstMessageWithSender = tester.widgetList (find.byType (MessageWithSender )).first;
68
+ return tester.widgetList <RealmContentNetworkImage >(
69
+ find.descendant (
70
+ of: find.byWidget (firstMessageWithSender),
71
+ matching: find.byType (RealmContentNetworkImage )),
72
+ ).singleOrNull;
73
+ }
74
+
75
+ void checkResultForSender (User sender) {
76
+ final avatarUrl = sender.avatarUrl;
77
+ switch (avatarUrl) {
78
+ case String (): {
79
+ check (findAvatarImageWidget (tester)).isNotNull ().src.equals (resolveUrl (avatarUrl, eg.selfAccount));
80
+ }
81
+ case null : {
82
+ check (findAvatarImageWidget (tester)).isNull ();
83
+ }
84
+ }
85
+ }
86
+
87
+ Future <void > handleNewAvatarEventAndPump (WidgetTester tester, String avatarUrl) async {
88
+ final store = await TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
89
+ store.handleEvent (RealmUserUpdateEvent (id: 1 , userId: eg.selfUser.userId, avatarUrl: avatarUrl));
90
+ await tester.pump ();
91
+ }
92
+
93
+ final httpClient = FakeHttpClient ();
94
+ debugNetworkImageHttpClientProvider = () => httpClient;
95
+ httpClient.request.response
96
+ ..statusCode = HttpStatus .ok
97
+ ..content = kSolidBlueAvatar;
98
+
99
+ await setupMessageListPage (tester, narrow: const AllMessagesNarrow ());
100
+ checkResultForSender (eg.selfUser);
101
+
102
+ await handleNewAvatarEventAndPump (tester, '/foo.png' );
103
+ // TODO only vary [avatarUrl], not other fields
104
+ checkResultForSender (eg.user (userId: eg.selfUser.userId, avatarUrl: '/foo.png' ));
105
+
106
+ await handleNewAvatarEventAndPump (tester, '/bar.jpg' );
107
+ // TODO only vary [avatarUrl], not other fields
108
+ checkResultForSender (eg.user (userId: eg.selfUser.userId, avatarUrl: '/bar.jpg' ));
109
+
110
+ debugNetworkImageHttpClientProvider = null ;
111
+ });
112
+ });
113
+
54
114
group ('ScrollToBottomButton interactions' , () {
55
115
ScrollController ? findMessageListScrollController (WidgetTester tester) {
56
116
final stickyHeaderListView = tester.widget <StickyHeaderListView >(find.byType (StickyHeaderListView ));
0 commit comments