11import 'package:checks/checks.dart' ;
2+ import 'package:collection/collection.dart' ;
23import 'package:flutter_test/flutter_test.dart' ;
4+ import 'package:zulip/api/model/events.dart' ;
35import 'package:zulip/api/model/model.dart' ;
6+ import 'package:zulip/model/channel.dart' ;
47import 'package:zulip/model/recent_senders.dart' ;
58import '../example_data.dart' as eg;
69
710/// [messages] should be sorted by [id] ascending.
811void checkMatchesMessages (RecentSenders model, List <Message > messages) {
912 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 = {};
1114 for (final message in messages) {
1215 if (message is ! StreamMessage ) {
1316 throw UnsupportedError ('Message of type ${message .runtimeType } is not expected.' );
@@ -17,7 +20,7 @@ void checkMatchesMessages(RecentSenders model, List<Message> messages) {
1720
1821 ((messagesByUserInStream[streamId] ?? = {})
1922 [senderId] ?? = {}).add (messageId);
20- (((messagesByUserInTopic[streamId] ?? = {} )[topic] ?? = {})
23+ (((messagesByUserInTopic[streamId] ?? = makeTopicKeyedMap () )[topic] ?? = {})
2124 [senderId] ?? = {}).add (messageId);
2225 }
2326
@@ -125,6 +128,16 @@ void main() {
125128 [eg.streamMessage (stream: streamA, topic: 'other' , sender: userX)]);
126129 });
127130
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+
128141 test ('add new stream' , () {
129142 checkHandleMessages (
130143 [eg.streamMessage (stream: streamA, topic: 'thing' , sender: userX)],
@@ -161,6 +174,16 @@ void main() {
161174 Map .fromEntries (messages.map ((msg) => MapEntry (msg.id, msg))));
162175
163176 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, []);
164187 });
165188
166189 test ('RecentSenders.latestMessageIdOfSenderInStream' , () {
@@ -200,6 +223,9 @@ void main() {
200223
201224 check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
202225 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 );
203229 // No message of user 20 in topic "a".
204230 check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
205231 topic: eg.t ('a' ), senderId: 20 )).equals (null );
@@ -211,3 +237,7 @@ void main() {
211237 topic: eg.t ('a' ), senderId: 10 )).equals (null );
212238 });
213239}
240+
241+ extension MessageIdTrackerChecks on Subject <MessageIdTracker > {
242+ Subject <QueueList <int >> get ids => has ((x) => x.ids, 'ids' );
243+ }
0 commit comments