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