@@ -438,6 +438,24 @@ impl MemoryStore {
438
438
439
439
Ok ( ( ) )
440
440
}
441
+
442
+ async fn remove_room ( & self , room_id : & RoomId ) -> Result < ( ) > {
443
+ self . members . remove ( room_id) ;
444
+ self . profiles . remove ( room_id) ;
445
+ self . display_names . remove ( room_id) ;
446
+ self . joined_user_ids . remove ( room_id) ;
447
+ self . invited_user_ids . remove ( room_id) ;
448
+ self . room_info . remove ( room_id) ;
449
+ self . room_state . remove ( room_id) ;
450
+ self . room_account_data . remove ( room_id) ;
451
+ self . stripped_room_info . remove ( room_id) ;
452
+ self . stripped_room_state . remove ( room_id) ;
453
+ self . stripped_members . remove ( room_id) ;
454
+ self . room_user_receipts . remove ( room_id) ;
455
+ self . room_event_receipts . remove ( room_id) ;
456
+
457
+ Ok ( ( ) )
458
+ }
441
459
}
442
460
443
461
#[ cfg_attr( target_arch = "wasm32" , async_trait( ?Send ) ) ]
@@ -584,111 +602,116 @@ impl StateStore for MemoryStore {
584
602
async fn remove_media_content_for_uri ( & self , uri : & MxcUri ) -> Result < ( ) > {
585
603
self . remove_media_content_for_uri ( uri) . await
586
604
}
605
+
606
+ async fn remove_room ( & self , room_id : & RoomId ) -> Result < ( ) > {
607
+ self . remove_room ( room_id) . await
608
+ }
587
609
}
588
610
589
611
#[ cfg( test) ]
590
612
mod test {
591
- use matrix_sdk_test:: async_test;
613
+ use matrix_sdk_test:: { async_test, test_json } ;
592
614
use ruma:: {
593
- api:: client:: r0:: media:: get_content_thumbnail:: Method , event_id, mxc_uri,
594
- receipt:: ReceiptType , room_id, uint, user_id, UserId ,
615
+ api:: client:: r0:: media:: get_content_thumbnail:: Method ,
616
+ events:: { AnyEphemeralRoomEventContent , AnySyncEphemeralRoomEvent , EventType } ,
617
+ mxc_uri,
618
+ receipt:: ReceiptType ,
619
+ uint,
595
620
} ;
596
- use serde_json:: json ;
621
+ use serde_json:: Value as JsonValue ;
597
622
598
623
use super :: { MemoryStore , StateChanges } ;
599
- use crate :: media:: { MediaFormat , MediaRequest , MediaThumbnailSize , MediaType } ;
600
-
601
- fn user_id ( ) -> & ' static UserId {
602
- user_id ! ( "@example:localhost" )
603
- }
624
+ use crate :: {
625
+ media:: { MediaFormat , MediaRequest , MediaThumbnailSize , MediaType } ,
626
+ store:: test:: {
627
+ first_receipt_event_id, populated_store, room_id, second_receipt_event_id,
628
+ stripped_room_id, user_id,
629
+ } ,
630
+ } ;
604
631
605
632
#[ async_test]
606
633
async fn test_receipts_saving ( ) {
607
634
let store = MemoryStore :: new ( ) ;
608
635
609
- let room_id = room_id ! ( "!test:localhost" ) ;
610
-
611
- let first_event_id = event_id ! ( "$1435641916114394fHBLK:matrix.org" ) . to_owned ( ) ;
612
- let second_event_id = event_id ! ( "$fHBLK1435641916114394:matrix.org" ) . to_owned ( ) ;
613
-
614
- let first_receipt_event = serde_json:: from_value ( json ! ( {
615
- first_event_id. clone( ) : {
616
- "m.read" : {
617
- user_id( ) . to_owned( ) : {
618
- "ts" : 1436451550453u64
619
- }
620
- }
621
- }
622
- } ) )
623
- . unwrap ( ) ;
636
+ let user_id = user_id ( ) ;
637
+ let room_id = room_id ( ) ;
638
+ let first_event_id = first_receipt_event_id ( ) ;
639
+ let second_event_id = second_receipt_event_id ( ) ;
640
+
641
+ let first_receipt_json: & JsonValue = & test_json:: READ_RECEIPT ;
642
+ let first_receipt_event =
643
+ serde_json:: from_value :: < AnySyncEphemeralRoomEvent > ( first_receipt_json. clone ( ) )
644
+ . unwrap ( ) ;
645
+ let first_receipt_content = match first_receipt_event. content ( ) {
646
+ AnyEphemeralRoomEventContent :: Receipt ( content) => content,
647
+ _ => panic ! ( ) ,
648
+ } ;
624
649
625
- let second_receipt_event = serde_json:: from_value ( json ! ( {
626
- second_event_id. clone( ) : {
627
- "m.read" : {
628
- user_id( ) . to_owned( ) : {
629
- "ts" : 1436451551453u64
630
- }
631
- }
632
- }
633
- } ) )
634
- . unwrap ( ) ;
650
+ let second_receipt_json: & JsonValue = & test_json:: READ_RECEIPT_OTHER ;
651
+ let second_receipt_event =
652
+ serde_json:: from_value :: < AnySyncEphemeralRoomEvent > ( second_receipt_json. clone ( ) )
653
+ . unwrap ( ) ;
654
+ let second_receipt_content = match second_receipt_event. content ( ) {
655
+ AnyEphemeralRoomEventContent :: Receipt ( content) => content,
656
+ _ => panic ! ( ) ,
657
+ } ;
635
658
636
659
assert ! ( store
637
- . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id( ) )
660
+ . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id)
638
661
. await
639
662
. unwrap( )
640
663
. is_none( ) ) ;
641
664
assert ! ( store
642
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & first_event_id)
665
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , first_event_id)
643
666
. await
644
667
. unwrap( )
645
668
. is_empty( ) ) ;
646
669
assert ! ( store
647
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & second_event_id)
670
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , second_event_id)
648
671
. await
649
672
. unwrap( )
650
673
. is_empty( ) ) ;
651
674
652
675
let mut changes = StateChanges :: default ( ) ;
653
- changes. add_receipts ( room_id, first_receipt_event ) ;
676
+ changes. add_receipts ( room_id, first_receipt_content ) ;
654
677
655
678
store. save_changes ( & changes) . await . unwrap ( ) ;
656
679
assert ! ( store
657
- . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id( ) )
680
+ . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id)
658
681
. await
659
682
. unwrap( )
660
683
. is_some( ) , ) ;
661
684
assert_eq ! (
662
685
store
663
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & first_event_id)
686
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , first_event_id)
664
687
. await
665
688
. unwrap( )
666
689
. len( ) ,
667
690
1
668
691
) ;
669
692
assert ! ( store
670
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & second_event_id)
693
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , second_event_id)
671
694
. await
672
695
. unwrap( )
673
696
. is_empty( ) ) ;
674
697
675
698
let mut changes = StateChanges :: default ( ) ;
676
- changes. add_receipts ( room_id, second_receipt_event ) ;
699
+ changes. add_receipts ( room_id, second_receipt_content ) ;
677
700
678
701
store. save_changes ( & changes) . await . unwrap ( ) ;
679
702
assert ! ( store
680
- . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id( ) )
703
+ . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id)
681
704
. await
682
705
. unwrap( )
683
706
. is_some( ) ) ;
684
707
assert ! ( store
685
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & first_event_id)
708
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , first_event_id)
686
709
. await
687
710
. unwrap( )
688
711
. is_empty( ) ) ;
689
712
assert_eq ! (
690
713
store
691
- . get_event_room_receipt_events( room_id, ReceiptType :: Read , & second_event_id)
714
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , second_event_id)
692
715
. await
693
716
. unwrap( )
694
717
. len( ) ,
@@ -734,4 +757,93 @@ mod test {
734
757
assert ! ( store. get_media_content( & request_file) . await . unwrap( ) . is_none( ) ) ;
735
758
assert ! ( store. get_media_content( & request_thumbnail) . await . unwrap( ) . is_none( ) ) ;
736
759
}
760
+
761
+ #[ async_test]
762
+ async fn test_populate_store ( ) {
763
+ let room_id = room_id ( ) ;
764
+ let user_id = user_id ( ) ;
765
+
766
+ let store = populated_store ( Box :: new ( MemoryStore :: new ( ) ) ) . await . unwrap ( ) ;
767
+
768
+ assert ! ( store. get_sync_token( ) . await . unwrap( ) . is_some( ) ) ;
769
+ assert ! ( store. get_presence_event( user_id) . await . unwrap( ) . is_some( ) ) ;
770
+ assert_eq ! ( store. get_room_infos( ) . await . unwrap( ) . len( ) , 2 ) ;
771
+ assert_eq ! ( store. get_stripped_room_infos( ) . await . unwrap( ) . len( ) , 1 ) ;
772
+ assert ! ( store. get_account_data_event( EventType :: PushRules ) . await . unwrap( ) . is_some( ) ) ;
773
+
774
+ assert ! ( store. get_state_event( room_id, EventType :: RoomName , "" ) . await . unwrap( ) . is_some( ) ) ;
775
+ assert_eq ! ( store. get_state_events( room_id, EventType :: RoomTopic ) . await . unwrap( ) . len( ) , 1 ) ;
776
+ assert ! ( store. get_profile( room_id, user_id) . await . unwrap( ) . is_some( ) ) ;
777
+ assert ! ( store. get_member_event( room_id, user_id) . await . unwrap( ) . is_some( ) ) ;
778
+ assert_eq ! ( store. get_user_ids( room_id) . await . unwrap( ) . len( ) , 2 ) ;
779
+ assert_eq ! ( store. get_invited_user_ids( room_id) . await . unwrap( ) . len( ) , 1 ) ;
780
+ assert_eq ! ( store. get_joined_user_ids( room_id) . await . unwrap( ) . len( ) , 1 ) ;
781
+ assert_eq ! ( store. get_users_with_display_name( room_id, "example" ) . await . unwrap( ) . len( ) , 2 ) ;
782
+ assert ! ( store
783
+ . get_room_account_data_event( room_id, EventType :: Tag )
784
+ . await
785
+ . unwrap( )
786
+ . is_some( ) ) ;
787
+ assert ! ( store
788
+ . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id)
789
+ . await
790
+ . unwrap( )
791
+ . is_some( ) ) ;
792
+ assert_eq ! (
793
+ store
794
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , first_receipt_event_id( ) )
795
+ . await
796
+ . unwrap( )
797
+ . len( ) ,
798
+ 1
799
+ ) ;
800
+ }
801
+
802
+ #[ async_test]
803
+ async fn test_room_removal ( ) {
804
+ let room_id = room_id ( ) ;
805
+ let user_id = user_id ( ) ;
806
+ let stripped_room_id = stripped_room_id ( ) ;
807
+
808
+ let store = populated_store ( Box :: new ( MemoryStore :: new ( ) ) ) . await . unwrap ( ) ;
809
+
810
+ // We assume the store was correctly populated like the test above.
811
+
812
+ store. remove_room ( room_id) . await . unwrap ( ) ;
813
+
814
+ assert_eq ! ( store. get_room_infos( ) . await . unwrap( ) . len( ) , 1 ) ;
815
+ assert_eq ! ( store. get_stripped_room_infos( ) . await . unwrap( ) . len( ) , 1 ) ;
816
+
817
+ assert ! ( store. get_state_event( room_id, EventType :: RoomName , "" ) . await . unwrap( ) . is_none( ) ) ;
818
+ assert_eq ! ( store. get_state_events( room_id, EventType :: RoomTopic ) . await . unwrap( ) . len( ) , 0 ) ;
819
+ assert ! ( store. get_profile( room_id, user_id) . await . unwrap( ) . is_none( ) ) ;
820
+ assert ! ( store. get_member_event( room_id, user_id) . await . unwrap( ) . is_none( ) ) ;
821
+ assert_eq ! ( store. get_user_ids( room_id) . await . unwrap( ) . len( ) , 0 ) ;
822
+ assert_eq ! ( store. get_invited_user_ids( room_id) . await . unwrap( ) . len( ) , 0 ) ;
823
+ assert_eq ! ( store. get_joined_user_ids( room_id) . await . unwrap( ) . len( ) , 0 ) ;
824
+ assert_eq ! ( store. get_users_with_display_name( room_id, "example" ) . await . unwrap( ) . len( ) , 0 ) ;
825
+ assert ! ( store
826
+ . get_room_account_data_event( room_id, EventType :: Tag )
827
+ . await
828
+ . unwrap( )
829
+ . is_none( ) ) ;
830
+ assert ! ( store
831
+ . get_user_room_receipt_event( room_id, ReceiptType :: Read , user_id)
832
+ . await
833
+ . unwrap( )
834
+ . is_none( ) ) ;
835
+ assert_eq ! (
836
+ store
837
+ . get_event_room_receipt_events( room_id, ReceiptType :: Read , first_receipt_event_id( ) )
838
+ . await
839
+ . unwrap( )
840
+ . len( ) ,
841
+ 0
842
+ ) ;
843
+
844
+ store. remove_room ( stripped_room_id) . await . unwrap ( ) ;
845
+
846
+ assert_eq ! ( store. get_room_infos( ) . await . unwrap( ) . len( ) , 0 ) ;
847
+ assert_eq ! ( store. get_stripped_room_infos( ) . await . unwrap( ) . len( ) , 0 ) ;
848
+ }
737
849
}
0 commit comments