1
+ import 'package:checks/checks.dart' ;
2
+ import 'package:test/scaffolding.dart' ;
3
+ import 'package:zulip/api/model/events.dart' ;
4
+ import 'package:zulip/api/model/model.dart' ;
5
+ import 'package:zulip/api/route/messages.dart' ;
6
+ import 'package:zulip/model/message_list.dart' ;
7
+ import 'package:zulip/model/narrow.dart' ;
8
+ import 'package:zulip/model/store.dart' ;
9
+ import '../api/fake_api.dart' ;
10
+ import '../model/binding.dart' ;
11
+ import '../model/test_store.dart' ;
12
+ import '../example_data.dart' as eg;
13
+
14
+ const int userId = 1 ;
15
+ const int streamId = 2 ;
16
+
17
+ Future <PerAccountStore > setupStore (ZulipStream stream) async {
18
+ await TestZulipBinding .instance.globalStore.add (eg.selfAccount, eg.initialSnapshot ());
19
+ PerAccountStore store = await TestZulipBinding .instance.globalStore.perAccount (eg.selfAccount.id);
20
+ store.addUser (eg.user (userId: userId));
21
+ store.addStream (stream);
22
+ return store;
23
+ }
24
+
25
+ Future <MessageListView > messageListViewWithMessages (List <Message > messages, PerAccountStore store, Narrow narrow) async {
26
+ MessageListView messageList = MessageListView .init (store: store, narrow: narrow);
27
+
28
+ final connection = store.connection as FakeApiConnection ;
29
+
30
+ connection.prepare (json: GetMessagesResult (
31
+ anchor: messages.first.id,
32
+ foundNewest: true ,
33
+ foundOldest: true ,
34
+ foundAnchor: true ,
35
+ historyLimited: false ,
36
+ messages: messages,
37
+ ).toJson ());
38
+
39
+ await messageList.fetch ();
40
+
41
+ check (messageList.messages.length).equals (messages.length);
42
+
43
+ return messageList;
44
+ }
45
+
46
+ void main () async {
47
+ TestZulipBinding .ensureInitialized ();
48
+ const narrow = StreamNarrow (streamId);
49
+
50
+ final ZulipStream stream = eg.stream (streamId: streamId);
51
+ PerAccountStore store = await setupStore (stream);
52
+
53
+ group ('update message tests' , () {
54
+
55
+ test ('find message in message list returns index of message' , () async {
56
+ Message m1 = eg.streamMessage (id: 792 , stream: stream);
57
+ Message m2 = eg.streamMessage (id: 793 , stream: stream);
58
+ Message m3 = eg.streamMessage (id: 794 , stream: stream);
59
+
60
+ MessageListView messageList = await messageListViewWithMessages ([m1, m2, m3], store, narrow);
61
+
62
+ int idx = messageList.findMessageWithId (793 );
63
+ check (idx).equals (1 );
64
+
65
+ idx = messageList.findMessageWithId (999 );
66
+ check (idx).equals (- 1 );
67
+ });
68
+
69
+ test ('update events are correctly applied to message when it is in the stream' , () async {
70
+ String oldContent = "<p>Hello, world</p>" ;
71
+ String newContent = "<p>Hello, edited</p>" ;
72
+ int newTimestamp = 99999 ;
73
+
74
+ List <String > oldFlags = [];
75
+ List <String > newFlags = ["starred" ];
76
+
77
+ Message m = eg.streamMessage (id: 243 , stream: stream, content: oldContent, flags: oldFlags);
78
+ MessageListView messageList = await messageListViewWithMessages ([m], store, narrow);
79
+
80
+ UpdateMessageEvent updateEvent = UpdateMessageEvent (
81
+ id: 1 ,
82
+ messageId: m.id,
83
+ messageIds: [m.id],
84
+ flags: newFlags,
85
+ renderedContent: newContent,
86
+ editTimestamp: newTimestamp,
87
+ isMeMessage: true
88
+ );
89
+
90
+ Message oldMessage = messageList.messages[0 ];
91
+ check (oldMessage.content).equals (oldContent);
92
+ check (oldMessage.flags).deepEquals (oldFlags);
93
+ check (oldMessage.isMeMessage).equals (false );
94
+
95
+ bool listenersNotified = false ;
96
+
97
+ messageList.addListener (() { listenersNotified = true ; });
98
+ messageList.maybeUpdateMessage (updateEvent);
99
+
100
+ Message updatedMessage = messageList.messages[0 ];
101
+
102
+ check (listenersNotified).equals (true );
103
+ check (updatedMessage.content).equals (newContent);
104
+ check (updatedMessage.lastEditTimestamp).equals (newTimestamp);
105
+ check (updatedMessage.flags).deepEquals (newFlags);
106
+ check (updatedMessage.isMeMessage).equals (true );
107
+
108
+ });
109
+
110
+ test ('update event is ignored when message is not in the message list' , () async {
111
+ String oldContent = "<p>Hello, world</p>" ;
112
+ String newContent = "<p>Hello, edited</p>" ;
113
+ int newTimestamp = 99999 ;
114
+
115
+ Message m = eg.streamMessage (id: 243 , stream: stream, content: oldContent);
116
+ MessageListView messageList = await messageListViewWithMessages ([m], store, narrow);
117
+
118
+ UpdateMessageEvent updateEvent = UpdateMessageEvent (
119
+ id: 1 ,
120
+ messageId: 972 ,
121
+ messageIds: [972 ],
122
+ flags: m.flags,
123
+ renderedContent: newContent,
124
+ editTimestamp: newTimestamp,
125
+ );
126
+
127
+ Message oldMessage = messageList.messages[0 ];
128
+ check (oldMessage.content).equals (oldContent);
129
+
130
+ bool listenersNotified = false ;
131
+
132
+ messageList.addListener (() { listenersNotified = true ; });
133
+ messageList.maybeUpdateMessage (updateEvent);
134
+
135
+ Message updatedMessage = messageList.messages[0 ];
136
+
137
+ check (listenersNotified).equals (false );
138
+ check (updatedMessage.content).equals (oldContent);
139
+
140
+ });
141
+
142
+ });
143
+ }
0 commit comments