@@ -469,6 +469,153 @@ void main() {
469469        }
470470      }
471471    });
472+ 
473+     group ('moves' , () {
474+       final  origChannel =  eg.stream ();
475+       const  origTopic =  'origTopic' ;
476+       const  newTopic =  'newTopic' ;
477+ 
478+       group ('move read messages' , () {
479+         final  readMessages =  List <StreamMessage >.generate (10 ,
480+           (_) =>  eg.streamMessage (
481+             stream:  origChannel, topic:  origTopic, flags:  [MessageFlag .read]));
482+ 
483+         test ('to new topic' , () {
484+           prepare ();
485+           fillWithMessages (readMessages);
486+ 
487+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
488+             origMessages:  readMessages,
489+             newTopicStr:  newTopic));
490+           checkNotNotified ();
491+           checkMatchesMessages ([]);
492+         });
493+ 
494+         test ('from topic with unreads' , () {
495+           prepare ();
496+           final  unreadMessage =  eg.streamMessage (
497+             stream:  origChannel, topic:  origTopic);
498+           fillWithMessages ([...readMessages, unreadMessage]);
499+ 
500+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
501+             origMessages:  readMessages,
502+             newTopicStr:  newTopic));
503+           checkNotNotified ();
504+           checkMatchesMessages ([unreadMessage]);
505+         });
506+ 
507+         test ('to topic with unreads' , () {
508+           prepare ();
509+           final  unreadMessage =  eg.streamMessage (
510+             stream:  origChannel, topic:  newTopic);
511+           fillWithMessages ([...readMessages, unreadMessage]);
512+ 
513+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
514+             origMessages:  readMessages,
515+             newTopicStr:  newTopic,
516+           ));
517+           checkNotNotified ();
518+           checkMatchesMessages ([unreadMessage]);
519+         });
520+       });
521+ 
522+       group ('move unread messages' , () {
523+         final  unreadMessages =  List <StreamMessage >.generate (10 ,
524+           (_) =>  eg.streamMessage (stream:  origChannel, topic:  origTopic));
525+ 
526+         test ('to new topic' , () {
527+           prepare ();
528+           fillWithMessages (unreadMessages);
529+ 
530+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
531+             origMessages:  unreadMessages,
532+             newTopicStr:  newTopic));
533+           checkNotifiedOnce ();
534+           checkMatchesMessages ([
535+             for  (final  message in  unreadMessages)
536+               Message .fromJson (message.toJson ()..['subject' ] =  newTopic),
537+           ]);
538+         });
539+ 
540+         test ('to new channel' , () {
541+           prepare ();
542+           final  newChannel =  eg.stream ();
543+           fillWithMessages (unreadMessages);
544+ 
545+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
546+             origMessages:  unreadMessages,
547+             newStreamId:  newChannel.streamId));
548+           checkNotifiedOnce ();
549+           checkMatchesMessages ([
550+             for  (final  message in  unreadMessages)
551+               Message .fromJson (
552+                 message.toJson ()..['stream_id' ] =  newChannel.streamId),
553+           ]);
554+         });
555+ 
556+         test ('from topic containing other unreads' , () {
557+           prepare ();
558+           final  unreadMessage =  eg.streamMessage (
559+             stream:  origChannel, topic:  origTopic);
560+           fillWithMessages ([...unreadMessages, unreadMessage]);
561+ 
562+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
563+             origMessages:  unreadMessages,
564+             newTopicStr:  newTopic));
565+           checkNotifiedOnce ();
566+           checkMatchesMessages ([
567+             for  (final  message in  unreadMessages)
568+               Message .fromJson (message.toJson ()..['subject' ] =  newTopic),
569+             unreadMessage,
570+           ]);
571+         });
572+ 
573+         test ('to topic containing other unreads' , () {
574+           prepare ();
575+           final  unreadMessage =  eg.streamMessage (
576+             stream:  origChannel, topic:  newTopic);
577+           fillWithMessages ([...unreadMessages, unreadMessage]);
578+ 
579+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
580+             origMessages:  unreadMessages,
581+             newTopicStr:  newTopic));
582+           checkNotifiedOnce ();
583+           checkMatchesMessages ([
584+             for  (final  message in  unreadMessages)
585+               Message .fromJson (message.toJson ()..['subject' ] =  newTopic),
586+             unreadMessage,
587+           ]);
588+         });
589+ 
590+         test ('tolerate unsorted messages' , () {
591+           prepare ();
592+           final  unreadMessages =  List .generate (10 ,
593+             (i) =>  eg.streamMessage (id:  1000 - i, stream:  origChannel, topic:  origTopic));
594+ 
595+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
596+             origMessages:  unreadMessages,
597+             newTopicStr:  newTopic));
598+           checkNotifiedOnce ();
599+           checkMatchesMessages ([
600+             for  (final  message in  unreadMessages)
601+               Message .fromJson (message.toJson ()..['subject' ] =  newTopic)
602+           ]);
603+         });
604+ 
605+         test ('tolerate unreads unknown to the model' , () {
606+           prepare ();
607+           final  unknownUnreadMessage =  eg.streamMessage (
608+             stream:  eg.stream (), topic:  origTopic);
609+           fillWithMessages (unreadMessages);
610+ 
611+           model.handleUpdateMessageEvent (eg.updateMessageEventMoveFrom (
612+             origMessages:  [unknownUnreadMessage],
613+             newTopicStr:  newTopic));
614+           checkNotNotified ();
615+           checkMatchesMessages (unreadMessages);
616+         });
617+       });
618+     });
472619  });
473620
474621
0 commit comments