Skip to content

Commit 348171b

Browse files
committed
narrow: Implement static SendableNarrow.ofMessage
1 parent ae07310 commit 348171b

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

lib/model/narrow.dart

+12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ sealed class Narrow {
1919
/// A non-interleaved narrow, completely specifying a place to send a message.
2020
sealed class SendableNarrow extends Narrow {
2121
MessageDestination get destination;
22+
23+
static SendableNarrow ofMessage(Message message, {required int selfUserId}) {
24+
switch (message) {
25+
case StreamMessage(:var streamId, :var subject):
26+
return TopicNarrow(streamId, subject);
27+
case DmMessage(:var displayRecipient):
28+
return DmNarrow(
29+
allRecipientIds: displayRecipient.map((r) => r.id).toList(),
30+
selfUserId: selfUserId,
31+
);
32+
}
33+
}
2234
}
2335

2436
/// The narrow called "All messages" in the UI.

test/model/narrow_test.dart

+33
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,39 @@ import '../example_data.dart' as eg;
88
import 'narrow_checks.dart';
99

1010
void main() {
11+
group('SendableNarrow', () {
12+
test('stream message', () {
13+
final stream = eg.stream();
14+
final message = eg.streamMessage(inStream: stream);
15+
final actual = SendableNarrow.ofMessage(message, selfUserId: eg.selfUser.userId);
16+
check(actual).equals(TopicNarrow(stream.streamId, message.subject));
17+
});
18+
19+
test('dm message: self-dm', () {
20+
final message = eg.dmMessage(from: eg.selfUser, to: []);
21+
final actual = SendableNarrow.ofMessage(message, selfUserId: eg.selfUser.userId);
22+
check(actual).equals(DmNarrow(
23+
allRecipientIds: [eg.selfUser.userId],
24+
selfUserId: eg.selfUser.userId));
25+
});
26+
27+
test('dm message: 1:1', () {
28+
final message = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser]);
29+
final actual = SendableNarrow.ofMessage(message, selfUserId: eg.selfUser.userId);
30+
check(actual).equals(DmNarrow(
31+
allRecipientIds: [eg.selfUser.userId, eg.otherUser.userId],
32+
selfUserId: eg.selfUser.userId));
33+
});
34+
35+
test('dm message: group', () {
36+
final message = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser, eg.thirdUser]);
37+
final actual = SendableNarrow.ofMessage(message, selfUserId: eg.selfUser.userId);
38+
check(actual).equals(DmNarrow(
39+
allRecipientIds: [eg.selfUser.userId, eg.otherUser.userId, eg.thirdUser.userId],
40+
selfUserId: eg.selfUser.userId));
41+
});
42+
});
43+
1144
group('DmNarrow', () {
1245
test('constructor assertions', () {
1346
check(() => DmNarrow(allRecipientIds: [2, 12], selfUserId: 2)).returnsNormally();

0 commit comments

Comments
 (0)