File tree Expand file tree Collapse file tree 5 files changed +85
-51
lines changed Expand file tree Collapse file tree 5 files changed +85
-51
lines changed Original file line number Diff line number Diff line change @@ -576,7 +576,10 @@ class StreamMessage extends Message {
576
576
@JsonKey (includeToJson: true )
577
577
String get type => 'stream' ;
578
578
579
- final String displayRecipient;
579
+ // This is not nullable API-wise, but if the message move across streams we
580
+ // might set [displayRecipient] to null to invalidate it.
581
+ @JsonKey (required : true , disallowNullValue: true )
582
+ String ? displayRecipient;
580
583
int streamId;
581
584
582
585
StreamMessage ({
Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ import 'package:intl/intl.dart';
8
8
import '../api/model/model.dart' ;
9
9
import '../api/model/narrow.dart' ;
10
10
import '../api/route/messages.dart' ;
11
+ import '../log.dart' ;
11
12
import '../model/message_list.dart' ;
12
13
import '../model/narrow.dart' ;
13
14
import '../model/store.dart' ;
@@ -679,7 +680,9 @@ class StreamMessageRecipientHeader extends StatelessWidget {
679
680
streamWidget = const SizedBox (width: 16 );
680
681
} else {
681
682
final stream = store.streams[message.streamId];
682
- final streamName = stream? .name ?? message.displayRecipient; // TODO(log) if missing
683
+ final streamName = stream? .name
684
+ ?? message.displayRecipient
685
+ ?? '(unknown channel)' ; // TODO(log)
683
686
684
687
streamWidget = GestureDetector (
685
688
onTap: () => Navigator .push (context,
Original file line number Diff line number Diff line change @@ -49,6 +49,10 @@ extension MessageChecks on Subject<Message> {
49
49
Subject <String ?> get matchTopic => has ((e) => e.matchTopic, 'matchTopic' );
50
50
}
51
51
52
+ extension StreamMessageChecks on Subject <StreamMessage > {
53
+ Subject <String ?> get displayRecipient => has ((e) => e.displayRecipient, 'displayRecipient' );
54
+ }
55
+
52
56
extension ReactionsChecks on Subject <Reactions > {
53
57
Subject <int > get total => has ((e) => e.total, 'total' );
54
58
Subject <List <ReactionWithVotes >> get aggregated => has ((e) => e.aggregated, 'aggregated' );
Original file line number Diff line number Diff line change 1
1
import 'dart:convert' ;
2
2
3
3
import 'package:checks/checks.dart' ;
4
+ import 'package:json_annotation/json_annotation.dart' ;
4
5
import 'package:test/scaffolding.dart' ;
5
6
import 'package:zulip/api/model/model.dart' ;
6
7
@@ -149,6 +150,14 @@ void main() {
149
150
check (m2).flags.deepEquals ([MessageFlag .read, MessageFlag .unknown]);
150
151
});
151
152
153
+ test ('require displayRecipient on parse' , () {
154
+ check (() => StreamMessage .fromJson (baseStreamJson ()..['display_recipient' ] = null ))
155
+ .throws <DisallowedNullValueException >();
156
+
157
+ check (() => StreamMessage .fromJson (baseStreamJson ()..remove ('display_recipient' )))
158
+ .throws <MissingRequiredKeysException >();
159
+ });
160
+
152
161
// Code relevant to messageEditState is tested separately in the
153
162
// MessageEditState group.
154
163
});
You can’t perform that action at this time.
0 commit comments