@@ -469,6 +469,215 @@ void main() {
469
469
}
470
470
}
471
471
});
472
+
473
+ // For the reader:
474
+ // This implements tests without heavily parameterizing them;
475
+ // see and compare with the next commit that changes this.
476
+ group ('moves' , () {
477
+ final origChannel = eg.stream ();
478
+ const origTopic = 'origTopic' ;
479
+ const newTopic = 'newTopic' ;
480
+
481
+ Future <void > prepareStore () async {
482
+ prepare ();
483
+ await channelStore.addStream (origChannel);
484
+ await channelStore.addSubscription (eg.subscription (origChannel));
485
+ }
486
+
487
+ group ('move read messages' , () {
488
+ final readMessages = List <StreamMessage >.generate (10 ,
489
+ (_) => eg.streamMessage (
490
+ stream: origChannel, topic: origTopic, flags: [MessageFlag .read]));
491
+
492
+ test ('to new channel' , () async {
493
+ await prepareStore ();
494
+ final newChannel = eg.stream ();
495
+ await channelStore.addStream (newChannel);
496
+ await channelStore.addSubscription (eg.subscription (newChannel));
497
+ fillWithMessages (readMessages);
498
+
499
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
500
+ origMessages: readMessages,
501
+ newStreamId: newChannel.streamId));
502
+ checkNotNotified ();
503
+ checkMatchesMessages ([]);
504
+ });
505
+
506
+ test ('to new topic' , () async {
507
+ await prepareStore ();
508
+ fillWithMessages (readMessages);
509
+
510
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
511
+ origMessages: readMessages,
512
+ newTopicStr: newTopic));
513
+ checkNotNotified ();
514
+ checkMatchesMessages ([]);
515
+ });
516
+
517
+ test ('from topic with unreads' , () async {
518
+ await prepareStore ();
519
+ final unreadMessage = eg.streamMessage (
520
+ stream: origChannel, topic: origTopic);
521
+ fillWithMessages ([...readMessages, unreadMessage]);
522
+
523
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
524
+ origMessages: readMessages,
525
+ newTopicStr: newTopic));
526
+ checkNotNotified ();
527
+ checkMatchesMessages ([unreadMessage]);
528
+ });
529
+
530
+ test ('to topic with unreads' , () async {
531
+ await prepareStore ();
532
+ final unreadMessage = eg.streamMessage (
533
+ stream: origChannel, topic: newTopic);
534
+ fillWithMessages ([...readMessages, unreadMessage]);
535
+
536
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
537
+ origMessages: readMessages,
538
+ newTopicStr: newTopic,
539
+ ));
540
+ checkNotNotified ();
541
+ checkMatchesMessages ([unreadMessage]);
542
+ });
543
+ });
544
+
545
+ group ('move unread messages' , () {
546
+ final unreadMessages = List <StreamMessage >.generate (10 ,
547
+ (_) => eg.streamMessage (stream: origChannel, topic: origTopic));
548
+
549
+ test ('to another subscribed channel; same topic name' , () async {
550
+ await prepareStore ();
551
+ final newChannel = eg.stream ();
552
+ await channelStore.addStream (newChannel);
553
+ await channelStore.addSubscription (eg.subscription (newChannel));
554
+ fillWithMessages (unreadMessages);
555
+
556
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
557
+ origMessages: unreadMessages,
558
+ newStreamId: newChannel.streamId));
559
+ checkNotifiedOnce ();
560
+ checkMatchesMessages ([
561
+ for (final message in unreadMessages)
562
+ Message .fromJson (
563
+ message.toJson ()..['stream_id' ] = newChannel.streamId),
564
+ ]);
565
+ });
566
+
567
+ test ('to another subscribed channel; different topic name' , () async {
568
+ await prepareStore ();
569
+ final newChannel = eg.stream ();
570
+ await channelStore.addStream (newChannel);
571
+ await channelStore.addSubscription (eg.subscription (newChannel));
572
+ fillWithMessages (unreadMessages);
573
+
574
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
575
+ origMessages: unreadMessages,
576
+ newStreamId: newChannel.streamId,
577
+ newTopicStr: newTopic));
578
+ checkNotifiedOnce ();
579
+ checkMatchesMessages ([
580
+ for (final message in unreadMessages)
581
+ Message .fromJson (
582
+ message.toJson ()
583
+ ..['stream_id' ] = newChannel.streamId
584
+ ..['subject' ] = newTopic
585
+ ),
586
+ ]);
587
+ });
588
+
589
+ test ('to unsubscribed channel' , () async {
590
+ await prepareStore ();
591
+ final newChannel = eg.stream ();
592
+ await channelStore.addStream (newChannel);
593
+ assert (! channelStore.subscriptions.containsKey (newChannel.streamId));
594
+ fillWithMessages (unreadMessages);
595
+
596
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
597
+ origMessages: unreadMessages,
598
+ newStreamId: newChannel.streamId));
599
+ checkNotifiedOnce ();
600
+ checkMatchesMessages ([]);
601
+ });
602
+
603
+ test ('to new topic' , () async {
604
+ await prepareStore ();
605
+ fillWithMessages (unreadMessages);
606
+
607
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
608
+ origMessages: unreadMessages,
609
+ newTopicStr: newTopic));
610
+ checkNotifiedOnce ();
611
+ checkMatchesMessages ([
612
+ for (final message in unreadMessages)
613
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
614
+ ]);
615
+ });
616
+
617
+ test ('from topic containing other unreads' , () async {
618
+ await prepareStore ();
619
+ final unreadMessage = eg.streamMessage (
620
+ stream: origChannel, topic: origTopic);
621
+ fillWithMessages ([...unreadMessages, unreadMessage]);
622
+
623
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
624
+ origMessages: unreadMessages,
625
+ newTopicStr: newTopic));
626
+ checkNotifiedOnce ();
627
+ checkMatchesMessages ([
628
+ for (final message in unreadMessages)
629
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
630
+ unreadMessage,
631
+ ]);
632
+ });
633
+
634
+ test ('to topic containing other unreads' , () async {
635
+ await prepareStore ();
636
+ final unreadMessage = eg.streamMessage (
637
+ stream: origChannel, topic: newTopic);
638
+ fillWithMessages ([...unreadMessages, unreadMessage]);
639
+
640
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
641
+ origMessages: unreadMessages,
642
+ newTopicStr: newTopic));
643
+ checkNotifiedOnce ();
644
+ checkMatchesMessages ([
645
+ for (final message in unreadMessages)
646
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
647
+ unreadMessage,
648
+ ]);
649
+ });
650
+
651
+ test ('tolerates unsorted messages' , () async {
652
+ await prepareStore ();
653
+ final unreadMessages = List .generate (10 ,
654
+ (i) => eg.streamMessage (id: 1000 - i, stream: origChannel, topic: origTopic));
655
+ fillWithMessages (unreadMessages);
656
+
657
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
658
+ origMessages: unreadMessages,
659
+ newTopicStr: newTopic));
660
+ checkNotifiedOnce ();
661
+ checkMatchesMessages ([
662
+ for (final message in unreadMessages)
663
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic)
664
+ ]);
665
+ });
666
+
667
+ test ('tolerates unreads unknown to the model' , () async {
668
+ await prepareStore ();
669
+ final unknownUnreadMessage = eg.streamMessage (
670
+ stream: eg.stream (), topic: origTopic);
671
+ fillWithMessages (unreadMessages);
672
+
673
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
674
+ origMessages: [unknownUnreadMessage],
675
+ newTopicStr: newTopic));
676
+ checkNotNotified ();
677
+ checkMatchesMessages (unreadMessages);
678
+ });
679
+ });
680
+ });
472
681
});
473
682
474
683
0 commit comments