1+ import 'dart:collection' ;
2+
13import 'package:checks/checks.dart' ;
24import 'package:flutter_test/flutter_test.dart' ;
5+ import 'package:zulip/api/model/events.dart' ;
36import 'package:zulip/api/model/model.dart' ;
7+ import 'package:zulip/model/channel.dart' ;
48import 'package:zulip/model/recent_senders.dart' ;
59import '../example_data.dart' as eg;
10+ import '../stdlib_checks.dart' ;
11+ import 'recent_senders_checks.dart' ;
612
713/// [messages] should be sorted by [id] ascending.
814void checkMatchesMessages (RecentSenders model, List <Message > messages) {
915 final Map <int , Map <int , Set <int >>> messagesByUserInStream = {};
10- final Map <int , Map <TopicName , Map <int , Set <int >>>> messagesByUserInTopic = {};
16+ final Map <int , LinkedHashMap <TopicName , Map <int , Set <int >>>> messagesByUserInTopic = {};
1117 for (final message in messages) {
1218 if (message is ! StreamMessage ) {
1319 throw UnsupportedError ('Message of type ${message .runtimeType } is not expected.' );
@@ -17,7 +23,7 @@ void checkMatchesMessages(RecentSenders model, List<Message> messages) {
1723
1824 ((messagesByUserInStream[streamId] ?? = {})
1925 [senderId] ?? = {}).add (messageId);
20- (((messagesByUserInTopic[streamId] ?? = {} )[topic] ?? = {})
26+ (((messagesByUserInTopic[streamId] ?? = makeTopicKeyedMap () )[topic] ?? = {})
2127 [senderId] ?? = {}).add (messageId);
2228 }
2329
@@ -125,6 +131,17 @@ void main() {
125131 [eg.streamMessage (stream: streamA, topic: 'other' , sender: userX)]);
126132 });
127133
134+ test ('case-insensitive topics' , () {
135+ checkHandleMessages (
136+ [eg.streamMessage (stream: streamA, topic: 'thing' , sender: userX)],
137+ [eg.streamMessage (stream: streamA, topic: 'ThInG' , sender: userX)]);
138+ check (model.topicSenders).values.single.entries.single
139+ ..key.equals (eg.t ('thing' ))
140+ ..value.entries.single.which ((it) => it
141+ ..key.equals (userX.userId)
142+ ..value.isA <MessageIdTracker >().ids.length.equals (2 ));
143+ });
144+
128145 test ('add new stream' , () {
129146 checkHandleMessages (
130147 [eg.streamMessage (stream: streamA, topic: 'thing' , sender: userX)],
@@ -161,6 +178,16 @@ void main() {
161178 Map .fromEntries (messages.map ((msg) => MapEntry (msg.id, msg))));
162179
163180 checkMatchesMessages (model, [messages[1 ]]);
181+
182+ // check case-insensitivity
183+ model.handleDeleteMessageEvent (DeleteMessageEvent (
184+ id: 0 ,
185+ messageIds: [messages[1 ].id],
186+ messageType: MessageType .stream,
187+ streamId: stream.streamId,
188+ topic: eg.t ('oThEr' ),
189+ ), {messages[1 ].id: messages[1 ]});
190+ checkMatchesMessages (model, []);
164191 });
165192
166193 test ('RecentSenders.latestMessageIdOfSenderInStream' , () {
@@ -200,6 +227,9 @@ void main() {
200227
201228 check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
202229 topic: eg.t ('a' ), senderId: 10 )).equals (300 );
230+ // case-insensitivity
231+ check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
232+ topic: eg.t ('A' ), senderId: 10 )).equals (300 );
203233 // No message of user 20 in topic "a".
204234 check (model.latestMessageIdOfSenderInTopic (streamId: 1 ,
205235 topic: eg.t ('a' ), senderId: 20 )).equals (null );
0 commit comments