Skip to content

Commit 171b956

Browse files
committed
narrow [nfc]: Make containsMessage support MessageBase
This is NFC because we don't have non-testing subclasses of MessageBase.
1 parent ca20932 commit 171b956

File tree

2 files changed

+83
-13
lines changed

2 files changed

+83
-13
lines changed

lib/model/narrow.dart

+18-13
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ sealed class Narrow {
1919
/// This does not necessarily mean the message list would show this message
2020
/// when navigated to this narrow; in particular it does not address the
2121
/// question of whether the stream or topic, or the sending user, is muted.
22-
bool containsMessage(Message message);
22+
bool containsMessage(MessageBase message);
2323

2424
/// This narrow, expressed as an [ApiNarrow].
2525
ApiNarrow apiEncode();
@@ -47,7 +47,7 @@ class CombinedFeedNarrow extends Narrow {
4747
const CombinedFeedNarrow();
4848

4949
@override
50-
bool containsMessage(Message message) {
50+
bool containsMessage(MessageBase message) {
5151
return true;
5252
}
5353

@@ -71,8 +71,9 @@ class ChannelNarrow extends Narrow {
7171
final int streamId;
7272

7373
@override
74-
bool containsMessage(Message message) {
75-
return message is StreamMessage && message.streamId == streamId;
74+
bool containsMessage(MessageBase message) {
75+
final conversation = message.conversation;
76+
return conversation is StreamConversation && conversation.streamId == streamId;
7677
}
7778

7879
@override
@@ -105,9 +106,10 @@ class TopicNarrow extends Narrow implements SendableNarrow {
105106
TopicNarrow sansWith() => TopicNarrow(streamId, topic);
106107

107108
@override
108-
bool containsMessage(Message message) {
109-
return (message is StreamMessage
110-
&& message.streamId == streamId && message.topic == topic);
109+
bool containsMessage(MessageBase message) {
110+
final conversation = message.conversation;
111+
return conversation is StreamConversation
112+
&& conversation.streamId == streamId && conversation.topic == topic;
111113
}
112114

113115
@override
@@ -263,11 +265,12 @@ class DmNarrow extends Narrow implements SendableNarrow {
263265
late final String _key = otherRecipientIds.join(',');
264266

265267
@override
266-
bool containsMessage(Message message) {
267-
if (message is! DmMessage) return false;
268-
if (message.allRecipientIds.length != allRecipientIds.length) return false;
268+
bool containsMessage(MessageBase message) {
269+
final conversation = message.conversation;
270+
if (conversation is! DmConversation) return false;
271+
if (conversation.allRecipientIds.length != allRecipientIds.length) return false;
269272
int i = 0;
270-
for (final userId in message.allRecipientIds) {
273+
for (final userId in conversation.allRecipientIds) {
271274
if (userId != allRecipientIds[i]) return false;
272275
i++;
273276
}
@@ -307,7 +310,8 @@ class MentionsNarrow extends Narrow {
307310
const MentionsNarrow();
308311

309312
@override
310-
bool containsMessage(Message message) {
313+
bool containsMessage(MessageBase message) {
314+
if (message is! Message) return false;
311315
return message.flags.any((flag) {
312316
switch (flag) {
313317
case MessageFlag.mentioned:
@@ -346,7 +350,8 @@ class StarredMessagesNarrow extends Narrow {
346350
ApiNarrow apiEncode() => [ApiNarrowIs(IsOperand.starred)];
347351

348352
@override
349-
bool containsMessage(Message message) {
353+
bool containsMessage(MessageBase message) {
354+
if (message is! Message) return false;
350355
return message.flags.contains(MessageFlag.starred);
351356
}
352357

test/model/narrow_test.dart

+65
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@ import 'package:zulip/model/narrow.dart';
77
import '../example_data.dart' as eg;
88
import 'narrow_checks.dart';
99

10+
/// A [MessageBase] subclass for testing.
11+
// TODO(#1441): switch to outbox-messages instead
12+
sealed class _TestMessage<T extends Conversation> extends MessageBase<T> {
13+
@override
14+
final int? id = null;
15+
16+
_TestMessage() : super(senderId: eg.selfUser.userId, timestamp: 123456789);
17+
}
18+
19+
class _TestStreamMessage extends _TestMessage<StreamConversation> {
20+
@override
21+
final StreamConversation conversation;
22+
23+
_TestStreamMessage({required ZulipStream stream, required String topic})
24+
: conversation = StreamConversation(
25+
stream.streamId, TopicName(topic), displayRecipient: null);
26+
}
27+
28+
class _TestDmMessage extends _TestMessage<DmConversation> {
29+
@override
30+
final DmConversation conversation;
31+
32+
_TestDmMessage({required List<int> allRecipientIds})
33+
: conversation = DmConversation(allRecipientIds: allRecipientIds);
34+
}
35+
1036
void main() {
1137
group('SendableNarrow', () {
1238
test('ofMessage: stream message', () {
@@ -33,6 +59,13 @@ void main() {
3359
eg.streamMessage(stream: otherStream, topic: 'topic'))).isFalse();
3460
check(narrow.containsMessage(
3561
eg.streamMessage(stream: stream, topic: 'topic'))).isTrue();
62+
63+
check(narrow.containsMessage(
64+
_TestDmMessage(allRecipientIds: [1]))).isFalse();
65+
check(narrow.containsMessage(
66+
_TestStreamMessage(stream: otherStream, topic: 'topic'))).isFalse();
67+
check(narrow.containsMessage(
68+
_TestStreamMessage(stream: stream, topic: 'topic'))).isTrue();
3669
});
3770
});
3871

@@ -56,6 +89,15 @@ void main() {
5689
eg.streamMessage(stream: otherStream, topic: 'topic'))).isFalse();
5790
check(narrow.containsMessage(
5891
eg.streamMessage(stream: stream, topic: 'topic'))).isTrue();
92+
93+
check(narrow.containsMessage(
94+
_TestDmMessage(allRecipientIds: [1]))).isFalse();
95+
check(narrow.containsMessage(
96+
_TestStreamMessage(stream: stream, topic: 'topic2'))).isFalse();
97+
check(narrow.containsMessage(
98+
_TestStreamMessage(stream: otherStream, topic: 'topic'))).isFalse();
99+
check(narrow.containsMessage(
100+
_TestStreamMessage(stream: stream, topic: 'topic'))).isTrue();
59101
});
60102
});
61103

@@ -176,6 +218,19 @@ void main() {
176218
check(narrow123.containsMessage(dm(user2, [user1, user3]))).isTrue();
177219
check(narrow123.containsMessage(dm(user3, [user1, user2]))).isTrue();
178220
});
221+
222+
test('containsMessage with non-Message', () {
223+
final narrow = DmNarrow(allRecipientIds: [1, 2], selfUserId: 2);
224+
225+
check(narrow.containsMessage(
226+
_TestStreamMessage(stream: eg.stream(), topic: 'topic'))).isFalse();
227+
check(narrow.containsMessage(
228+
_TestDmMessage(allRecipientIds: [2]))).isFalse();
229+
check(narrow.containsMessage(
230+
_TestDmMessage(allRecipientIds: [2, 3]))).isFalse();
231+
check(narrow.containsMessage(
232+
_TestDmMessage(allRecipientIds: [1, 2]))).isTrue();
233+
});
179234
});
180235

181236
group('MentionsNarrow', () {
@@ -188,6 +243,11 @@ void main() {
188243
eg.streamMessage(flags:[MessageFlag.mentioned]))).isTrue();
189244
check(narrow.containsMessage(
190245
eg.streamMessage(flags: [MessageFlag.wildcardMentioned]))).isTrue();
246+
247+
check(narrow.containsMessage(
248+
_TestStreamMessage(stream: eg.stream(), topic: 'topic'))).isFalse();
249+
check(narrow.containsMessage(
250+
_TestDmMessage(allRecipientIds: [eg.selfUser.userId]))).isFalse();
191251
});
192252
});
193253

@@ -199,6 +259,11 @@ void main() {
199259
eg.streamMessage(flags: []))).isFalse();
200260
check(narrow.containsMessage(
201261
eg.streamMessage(flags:[MessageFlag.starred]))).isTrue();
262+
263+
check(narrow.containsMessage(
264+
_TestStreamMessage(stream: eg.stream(), topic: 'topic'))).isFalse();
265+
check(narrow.containsMessage(
266+
_TestDmMessage(allRecipientIds: [eg.selfUser.userId]))).isFalse();
202267
});
203268
});
204269
}

0 commit comments

Comments
 (0)