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