@@ -17,10 +17,12 @@ import '../api/model/model_checks.dart';
17
17
import '../example_data.dart' as eg;
18
18
import '../stdlib_checks.dart' ;
19
19
import 'content_checks.dart' ;
20
+ import 'test_store.dart' ;
20
21
21
22
void main () async {
22
23
// These variables are the common state operated on by each test.
23
24
// Each test case calls [prepare] to initialize them.
25
+ late Subscription subscription;
24
26
late PerAccountStore store;
25
27
late FakeApiConnection connection;
26
28
late MessageListView model;
@@ -35,7 +37,10 @@ void main() async {
35
37
36
38
/// Initialize [model] and the rest of the test state.
37
39
void prepare ({Narrow narrow = const AllMessagesNarrow ()}) {
38
- store = eg.store ();
40
+ final stream = eg.stream ();
41
+ subscription = eg.subscription (stream);
42
+ store = eg.store ()
43
+ ..addStream (stream)..addSubscription (subscription);
39
44
connection = store.connection as FakeApiConnection ;
40
45
notifiedCount = 0 ;
41
46
model = MessageListView .init (store: store, narrow: narrow)
@@ -548,6 +553,141 @@ void main() async {
548
553
check (model.contents[0 ]).equalsNode (correctContent);
549
554
});
550
555
556
+ group ('stream/topic muting' , () {
557
+ test ('in AllMessagesNarrow' , () async {
558
+ final stream1 = eg.stream (streamId: 1 , name: 'stream 1' );
559
+ final stream2 = eg.stream (streamId: 2 , name: 'stream 2' );
560
+ prepare (narrow: const AllMessagesNarrow ());
561
+ store.addStreams ([stream1, stream2]);
562
+ store.addSubscription (eg.subscription (stream1));
563
+ store.addUserTopic (stream1, 'B' , UserTopicVisibilityPolicy .muted);
564
+ store.addSubscription (eg.subscription (stream2, isMuted: true ));
565
+ store.addUserTopic (stream2, 'C' , UserTopicVisibilityPolicy .unmuted);
566
+
567
+ // Check filtering on fetchInitial…
568
+ await prepareMessages (foundOldest: false , messages: [
569
+ eg.streamMessage (id: 201 , stream: stream1, topic: 'A' ),
570
+ eg.streamMessage (id: 202 , stream: stream1, topic: 'B' ),
571
+ eg.streamMessage (id: 203 , stream: stream2, topic: 'C' ),
572
+ eg.streamMessage (id: 204 , stream: stream2, topic: 'D' ),
573
+ eg.dmMessage ( id: 205 , from: eg.otherUser, to: [eg.selfUser]),
574
+ ]);
575
+ final expected = < int > [];
576
+ check (model.messages.map ((m) => m.id))
577
+ .deepEquals (expected..addAll ([201 , 203 , 205 ]));
578
+
579
+ // … and on fetchOlder…
580
+ connection.prepare (json: olderResult (
581
+ anchor: 201 , foundOldest: true , messages: [
582
+ eg.streamMessage (id: 101 , stream: stream1, topic: 'A' ),
583
+ eg.streamMessage (id: 102 , stream: stream1, topic: 'B' ),
584
+ eg.streamMessage (id: 103 , stream: stream2, topic: 'C' ),
585
+ eg.streamMessage (id: 104 , stream: stream2, topic: 'D' ),
586
+ eg.dmMessage ( id: 105 , from: eg.otherUser, to: [eg.selfUser]),
587
+ ]).toJson ());
588
+ await model.fetchOlder ();
589
+ checkNotified (count: 2 );
590
+ check (model.messages.map ((m) => m.id))
591
+ .deepEquals (expected..insertAll (0 , [101 , 103 , 105 ]));
592
+
593
+ // … and on maybeAddMessage.
594
+ model.maybeAddMessage (eg.streamMessage (id: 301 , stream: stream1, topic: 'A' ));
595
+ checkNotifiedOnce ();
596
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (301 ));
597
+
598
+ model.maybeAddMessage (eg.streamMessage (id: 302 , stream: stream1, topic: 'B' ));
599
+ checkNotNotified ();
600
+ check (model.messages.map ((m) => m.id)).deepEquals (expected);
601
+
602
+ model.maybeAddMessage (eg.streamMessage (id: 303 , stream: stream2, topic: 'C' ));
603
+ checkNotifiedOnce ();
604
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (303 ));
605
+
606
+ model.maybeAddMessage (eg.streamMessage (id: 304 , stream: stream2, topic: 'D' ));
607
+ checkNotNotified ();
608
+ check (model.messages.map ((m) => m.id)).deepEquals (expected);
609
+
610
+ model.maybeAddMessage (eg.dmMessage (id: 305 , from: eg.otherUser, to: [eg.selfUser]));
611
+ checkNotifiedOnce ();
612
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (305 ));
613
+ });
614
+
615
+ test ('in StreamNarrow' , () async {
616
+ final stream = eg.stream (streamId: 1 , name: 'stream 1' );
617
+ prepare (narrow: StreamNarrow (stream.streamId));
618
+ store.addStream (stream);
619
+ store.addSubscription (eg.subscription (stream, isMuted: true ));
620
+ store.addUserTopic (stream, 'A' , UserTopicVisibilityPolicy .unmuted);
621
+ store.addUserTopic (stream, 'C' , UserTopicVisibilityPolicy .muted);
622
+
623
+ // Check filtering on fetchInitial…
624
+ await prepareMessages (foundOldest: false , messages: [
625
+ eg.streamMessage (id: 201 , stream: stream, topic: 'A' ),
626
+ eg.streamMessage (id: 202 , stream: stream, topic: 'B' ),
627
+ eg.streamMessage (id: 203 , stream: stream, topic: 'C' ),
628
+ ]);
629
+ final expected = < int > [];
630
+ check (model.messages.map ((m) => m.id))
631
+ .deepEquals (expected..addAll ([201 , 202 ]));
632
+
633
+ // … and on fetchOlder…
634
+ connection.prepare (json: olderResult (
635
+ anchor: 201 , foundOldest: true , messages: [
636
+ eg.streamMessage (id: 101 , stream: stream, topic: 'A' ),
637
+ eg.streamMessage (id: 102 , stream: stream, topic: 'B' ),
638
+ eg.streamMessage (id: 103 , stream: stream, topic: 'C' ),
639
+ ]).toJson ());
640
+ await model.fetchOlder ();
641
+ checkNotified (count: 2 );
642
+ check (model.messages.map ((m) => m.id))
643
+ .deepEquals (expected..insertAll (0 , [101 , 102 ]));
644
+
645
+ // … and on maybeAddMessage.
646
+ model.maybeAddMessage (eg.streamMessage (id: 301 , stream: stream, topic: 'A' ));
647
+ checkNotifiedOnce ();
648
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (301 ));
649
+
650
+ model.maybeAddMessage (eg.streamMessage (id: 302 , stream: stream, topic: 'B' ));
651
+ checkNotifiedOnce ();
652
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (302 ));
653
+
654
+ model.maybeAddMessage (eg.streamMessage (id: 303 , stream: stream, topic: 'C' ));
655
+ checkNotNotified ();
656
+ check (model.messages.map ((m) => m.id)).deepEquals (expected);
657
+ });
658
+
659
+ test ('in TopicNarrow' , () async {
660
+ final stream = eg.stream (streamId: 1 , name: 'stream 1' );
661
+ prepare (narrow: TopicNarrow (stream.streamId, 'A' ));
662
+ store.addStream (stream);
663
+ store.addSubscription (eg.subscription (stream, isMuted: true ));
664
+ store.addUserTopic (stream, 'A' , UserTopicVisibilityPolicy .muted);
665
+
666
+ // Check filtering on fetchInitial…
667
+ await prepareMessages (foundOldest: false , messages: [
668
+ eg.streamMessage (id: 201 , stream: stream, topic: 'A' ),
669
+ ]);
670
+ final expected = < int > [];
671
+ check (model.messages.map ((m) => m.id))
672
+ .deepEquals (expected..addAll ([201 ]));
673
+
674
+ // … and on fetchOlder…
675
+ connection.prepare (json: olderResult (
676
+ anchor: 201 , foundOldest: true , messages: [
677
+ eg.streamMessage (id: 101 , stream: stream, topic: 'A' ),
678
+ ]).toJson ());
679
+ await model.fetchOlder ();
680
+ checkNotified (count: 2 );
681
+ check (model.messages.map ((m) => m.id))
682
+ .deepEquals (expected..insertAll (0 , [101 ]));
683
+
684
+ // … and on maybeAddMessage.
685
+ model.maybeAddMessage (eg.streamMessage (id: 301 , stream: stream, topic: 'A' ));
686
+ checkNotifiedOnce ();
687
+ check (model.messages.map ((m) => m.id)).deepEquals (expected..add (301 ));
688
+ });
689
+ });
690
+
551
691
test ('recipient headers are maintained consistently' , () async {
552
692
// This tests the code that maintains the invariant that recipient headers
553
693
// are present just where [canShareRecipientHeader] requires them.
@@ -772,6 +912,22 @@ void checkInvariants(MessageListView model) {
772
912
check (model).fetchingOlder.isFalse ();
773
913
}
774
914
915
+ for (final message in model.messages) {
916
+ check (model.narrow.containsMessage (message)).isTrue ();
917
+
918
+ if (message is ! StreamMessage ) continue ;
919
+ switch (model.narrow) {
920
+ case AllMessagesNarrow ():
921
+ check (model.store.isTopicVisibleAsReceived (message.streamId, message.subject))
922
+ .isTrue ();
923
+ case StreamNarrow ():
924
+ check (model.store.isTopicVisibleInStream (message.streamId, message.subject))
925
+ .isTrue ();
926
+ case TopicNarrow ():
927
+ case DmNarrow ():
928
+ }
929
+ }
930
+
775
931
for (int i = 0 ; i < model.messages.length - 1 ; i++ ) {
776
932
check (model.messages[i].id).isLessThan (model.messages[i+ 1 ].id);
777
933
}
0 commit comments