1
1
import 'package:checks/checks.dart' ;
2
+ import 'package:collection/collection.dart' ;
2
3
import 'package:flutter_test/flutter_test.dart' ;
4
+ import 'package:zulip/api/model/events.dart' ;
3
5
import 'package:zulip/api/model/model.dart' ;
6
+ import 'package:zulip/model/channel.dart' ;
4
7
import 'package:zulip/model/recent_senders.dart' ;
5
8
import '../example_data.dart' as eg;
6
9
7
10
/// [messages] should be sorted by [id] ascending.
8
11
void checkMatchesMessages (RecentSenders model, List <Message > messages) {
9
12
final Map <int , Map <int , Set <int >>> messagesByUserInStream = {};
10
- final Map <int , Map < TopicName , Map <int , Set <int >>>> messagesByUserInTopic = {};
13
+ final Map <int , TopicKeyedMap < Map <int , Set <int >>>> messagesByUserInTopic = {};
11
14
for (final message in messages) {
12
15
if (message is ! StreamMessage ) {
13
16
throw UnsupportedError ('Message of type ${message .runtimeType } is not expected.' );
@@ -17,7 +20,7 @@ void checkMatchesMessages(RecentSenders model, List<Message> messages) {
17
20
18
21
((messagesByUserInStream[streamId] ?? = {})
19
22
[senderId] ?? = {}).add (messageId);
20
- (((messagesByUserInTopic[streamId] ?? = {} )[topic] ?? = {})
23
+ (((messagesByUserInTopic[streamId] ?? = makeTopicKeyedMap () )[topic] ?? = {})
21
24
[senderId] ?? = {}).add (messageId);
22
25
}
23
26
@@ -125,6 +128,16 @@ void main() {
125
128
[eg.streamMessage (stream: streamA, topic: 'other' , sender: userX)]);
126
129
});
127
130
131
+ test ('case-insensitive topics' , () {
132
+ checkHandleMessages (
133
+ [eg.streamMessage (stream: streamA, topic: 'thing' , sender: userX)],
134
+ [eg.streamMessage (stream: streamA, topic: 'ThInG' , sender: userX)]);
135
+ check (model.topicSenders).values.single.deepEquals (
136
+ {eg.t ('thing' ):
137
+ {userX.userId: (Subject <Object ?> it) =>
138
+ it.isA <MessageIdTracker >().ids.length.equals (2 )}});
139
+ });
140
+
128
141
test ('add new stream' , () {
129
142
checkHandleMessages (
130
143
[eg.streamMessage (stream: streamA, topic: 'thing' , sender: userX)],
@@ -161,6 +174,16 @@ void main() {
161
174
Map .fromEntries (messages.map ((msg) => MapEntry (msg.id, msg))));
162
175
163
176
checkMatchesMessages (model, [messages[1 ]]);
177
+
178
+ // check case-insensitivity
179
+ model.handleDeleteMessageEvent (DeleteMessageEvent (
180
+ id: 0 ,
181
+ messageIds: [messages[1 ].id],
182
+ messageType: MessageType .stream,
183
+ streamId: stream.streamId,
184
+ topic: eg.t ('oThEr' ),
185
+ ), {messages[1 ].id: messages[1 ]});
186
+ checkMatchesMessages (model, []);
164
187
});
165
188
166
189
test ('RecentSenders.latestMessageIdOfSenderInStream' , () {
@@ -200,6 +223,9 @@ void main() {
200
223
201
224
check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
202
225
topic: eg.t ('a' ), senderId: 10 )).equals (300 );
226
+ // case-insensitivity
227
+ check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
228
+ topic: eg.t ('A' ), senderId: 10 )).equals (300 );
203
229
// No message of user 20 in topic "a".
204
230
check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
205
231
topic: eg.t ('a' ), senderId: 20 )).equals (null );
@@ -211,3 +237,7 @@ void main() {
211
237
topic: eg.t ('a' ), senderId: 10 )).equals (null );
212
238
});
213
239
}
240
+
241
+ extension MessageIdTrackerChecks on Subject <MessageIdTracker > {
242
+ Subject <QueueList <int >> get ids => has ((x) => x.ids, 'ids' );
243
+ }
0 commit comments