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