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 mockMessage = eg.streamMessage (id: 243 , stream: stream, content: oldContent, flags: oldFlags);
78
+ MessageListView messageList = await messageListViewWithMessages ([mockMessage], store, narrow);
79
+
80
+ UpdateMessageEvent updateEvent = UpdateMessageEvent (
81
+ id: 1 ,
82
+ messageId: mockMessage.id,
83
+ messageIds: [mockMessage.id],
84
+ flags: newFlags,
85
+ renderedContent: newContent,
86
+ editTimestamp: newTimestamp,
87
+ isMeMessage: true
88
+ );
89
+
90
+ Message message = messageList.messages[0 ];
91
+ check (message.content).equals (oldContent);
92
+ check (message.flags).deepEquals (oldFlags);
93
+ check (message.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
+ check (updatedMessage).identicalTo (message);
102
+ check (listenersNotified).equals (true );
103
+
104
+ check (message.content).equals (newContent);
105
+ check (message.lastEditTimestamp).equals (newTimestamp);
106
+ check (message.flags).deepEquals (newFlags);
107
+ check (message.isMeMessage).equals (true );
108
+
109
+ });
110
+
111
+ test ('update event is ignored when message is not in the message list' , () async {
112
+ String oldContent = "<p>Hello, world</p>" ;
113
+ String newContent = "<p>Hello, edited</p>" ;
114
+ int newTimestamp = 99999 ;
115
+
116
+ Message mockMessage = eg.streamMessage (id: 243 , stream: stream, content: oldContent);
117
+ MessageListView messageList = await messageListViewWithMessages ([mockMessage], store, narrow);
118
+
119
+ UpdateMessageEvent updateEvent = UpdateMessageEvent (
120
+ id: 1 ,
121
+ messageId: 972 ,
122
+ messageIds: [972 ],
123
+ flags: mockMessage.flags,
124
+ renderedContent: newContent,
125
+ editTimestamp: newTimestamp,
126
+ );
127
+
128
+ Message message = messageList.messages[0 ];
129
+ check (message.content).equals (oldContent);
130
+
131
+ bool listenersNotified = false ;
132
+
133
+ messageList.addListener (() { listenersNotified = true ; });
134
+ messageList.maybeUpdateMessage (updateEvent);
135
+
136
+ Message updatedMessage = messageList.messages[0 ];
137
+
138
+ check (listenersNotified).equals (false );
139
+ check (updatedMessage).identicalTo (message);
140
+ check (message.content).equals (oldContent);
141
+
142
+ });
143
+
144
+ });
145
+ }
0 commit comments