@@ -7,7 +7,9 @@ import 'package:zulip/model/narrow.dart';
7
7
import 'package:zulip/model/store.dart' ;
8
8
9
9
import '../api/fake_api.dart' ;
10
+ import '../api/model/model_checks.dart' ;
10
11
import '../example_data.dart' as eg;
12
+ import '../stdlib_checks.dart' ;
11
13
import 'message_list_test.dart' ;
12
14
import 'test_store.dart' ;
13
15
@@ -48,7 +50,6 @@ void main() {
48
50
/// Perform the initial message fetch for [messageList] .
49
51
///
50
52
/// The test case must have already called [prepare] to initialize the state.
51
- // ignore: unused_element
52
53
Future <void > prepareMessages (
53
54
List <Message > messages, {
54
55
bool foundOldest = false ,
@@ -151,4 +152,87 @@ void main() {
151
152
check (store.messages).deepEquals ({1 : newMessage});
152
153
});
153
154
});
155
+
156
+ group ('handleReactionEvent' , () {
157
+ ReactionEvent mkEvent (Reaction reaction, ReactionOp op, int messageId) {
158
+ return ReactionEvent (
159
+ id: 1 ,
160
+ op: op,
161
+ emojiName: reaction.emojiName,
162
+ emojiCode: reaction.emojiCode,
163
+ reactionType: reaction.reactionType,
164
+ userId: reaction.userId,
165
+ messageId: messageId,
166
+ );
167
+ }
168
+
169
+ test ('add reaction' , () async {
170
+ final originalMessage = eg.streamMessage (reactions: []);
171
+ prepare ();
172
+ await prepareMessages ([originalMessage]);
173
+ final message = store.messages.values.single;
174
+
175
+ await store.handleEvent (
176
+ mkEvent (eg.unicodeEmojiReaction, ReactionOp .add, originalMessage.id));
177
+ checkNotifiedOnce ();
178
+ check (store.messages).values.single
179
+ ..identicalTo (message)
180
+ ..reactions.isNotNull ().jsonEquals ([eg.unicodeEmojiReaction]);
181
+ });
182
+
183
+ test ('add reaction; message is unknown' , () async {
184
+ final someMessage = eg.streamMessage (reactions: []);
185
+ prepare ();
186
+ await prepareMessages ([someMessage]);
187
+ await store.handleEvent (
188
+ mkEvent (eg.unicodeEmojiReaction, ReactionOp .add, 1000 ));
189
+ checkNotNotified ();
190
+ check (store.messages).values.single
191
+ .reactions.isNull ();
192
+ });
193
+
194
+ test ('remove reaction' , () async {
195
+ final eventReaction = Reaction (reactionType: ReactionType .unicodeEmoji,
196
+ emojiName: 'wave' , emojiCode: '1f44b' , userId: 1 );
197
+
198
+ // Same emoji, different user. Not to be removed.
199
+ final reaction2 = Reaction (reactionType: ReactionType .unicodeEmoji,
200
+ emojiName: 'wave' , emojiCode: '1f44b' , userId: 2 );
201
+
202
+ // Same user, different emoji. Not to be removed.
203
+ final reaction3 = Reaction (reactionType: ReactionType .unicodeEmoji,
204
+ emojiName: 'working_on_it' , emojiCode: '1f6e0' , userId: 1 );
205
+
206
+ // Same user, same emojiCode, different emojiName. To be removed: servers
207
+ // key on user, message, reaction type, and emoji code, but not emoji name.
208
+ // So we mimic that behavior; see discussion:
209
+ // https://github.com/zulip/zulip-flutter/pull/256#discussion_r1284865099
210
+ final reaction4 = Reaction (reactionType: ReactionType .unicodeEmoji,
211
+ emojiName: 'hello' , emojiCode: '1f44b' , userId: 1 );
212
+
213
+ final originalMessage = eg.streamMessage (
214
+ reactions: [reaction2, reaction3, reaction4]);
215
+ prepare ();
216
+ await prepareMessages ([originalMessage]);
217
+ final message = store.messages.values.single;
218
+
219
+ await store.handleEvent (
220
+ mkEvent (eventReaction, ReactionOp .remove, originalMessage.id));
221
+ checkNotifiedOnce ();
222
+ check (store.messages).values.single
223
+ ..identicalTo (message)
224
+ ..reactions.isNotNull ().jsonEquals ([reaction2, reaction3]);
225
+ });
226
+
227
+ test ('remove reaction; message is unknown' , () async {
228
+ final someMessage = eg.streamMessage (reactions: [eg.unicodeEmojiReaction]);
229
+ prepare ();
230
+ await prepareMessages ([someMessage]);
231
+ await store.handleEvent (
232
+ mkEvent (eg.unicodeEmojiReaction, ReactionOp .remove, 1000 ));
233
+ checkNotNotified ();
234
+ check (store.messages).values.single
235
+ .reactions.isNotNull ().jsonEquals ([eg.unicodeEmojiReaction]);
236
+ });
237
+ });
154
238
}
0 commit comments