@@ -469,6 +469,189 @@ 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' , () 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 unsubscribed channel' , () async {
565
+ await prepareStore ();
566
+ final newChannel = eg.stream ();
567
+ await channelStore.addStream (newChannel);
568
+ fillWithMessages (unreadMessages);
569
+
570
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
571
+ origMessages: unreadMessages,
572
+ newStreamId: newChannel.streamId));
573
+ checkNotifiedOnce ();
574
+ checkMatchesMessages ([]);
575
+ });
576
+
577
+ test ('to new topic' , () async {
578
+ await prepareStore ();
579
+ fillWithMessages (unreadMessages);
580
+
581
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
582
+ origMessages: unreadMessages,
583
+ newTopicStr: newTopic));
584
+ checkNotifiedOnce ();
585
+ checkMatchesMessages ([
586
+ for (final message in unreadMessages)
587
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
588
+ ]);
589
+ });
590
+
591
+ test ('from topic containing other unreads' , () async {
592
+ await prepareStore ();
593
+ final unreadMessage = eg.streamMessage (
594
+ stream: origChannel, topic: origTopic);
595
+ fillWithMessages ([...unreadMessages, unreadMessage]);
596
+
597
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
598
+ origMessages: unreadMessages,
599
+ newTopicStr: newTopic));
600
+ checkNotifiedOnce ();
601
+ checkMatchesMessages ([
602
+ for (final message in unreadMessages)
603
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
604
+ unreadMessage,
605
+ ]);
606
+ });
607
+
608
+ test ('to topic containing other unreads' , () async {
609
+ await prepareStore ();
610
+ final unreadMessage = eg.streamMessage (
611
+ stream: origChannel, topic: newTopic);
612
+ fillWithMessages ([...unreadMessages, unreadMessage]);
613
+
614
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
615
+ origMessages: unreadMessages,
616
+ newTopicStr: newTopic));
617
+ checkNotifiedOnce ();
618
+ checkMatchesMessages ([
619
+ for (final message in unreadMessages)
620
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic),
621
+ unreadMessage,
622
+ ]);
623
+ });
624
+
625
+ test ('tolerate unsorted messages' , () async {
626
+ await prepareStore ();
627
+ final unreadMessages = List .generate (10 ,
628
+ (i) => eg.streamMessage (id: 1000 - i, stream: origChannel, topic: origTopic));
629
+ fillWithMessages (unreadMessages);
630
+
631
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
632
+ origMessages: unreadMessages,
633
+ newTopicStr: newTopic));
634
+ checkNotifiedOnce ();
635
+ checkMatchesMessages ([
636
+ for (final message in unreadMessages)
637
+ Message .fromJson (message.toJson ()..['subject' ] = newTopic)
638
+ ]);
639
+ });
640
+
641
+ test ('tolerate unreads unknown to the model' , () async {
642
+ await prepareStore ();
643
+ final unknownUnreadMessage = eg.streamMessage (
644
+ stream: eg.stream (), topic: origTopic);
645
+ fillWithMessages (unreadMessages);
646
+
647
+ model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
648
+ origMessages: [unknownUnreadMessage],
649
+ newTopicStr: newTopic));
650
+ checkNotNotified ();
651
+ checkMatchesMessages (unreadMessages);
652
+ });
653
+ });
654
+ });
472
655
});
473
656
474
657
0 commit comments