1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- use std:: time:: Duration ;
15+ use std:: { sync :: Arc , time:: Duration } ;
1616
1717use as_variant:: as_variant;
1818use assert_matches:: assert_matches;
1919use assert_matches2:: assert_let;
2020use eyeball_im:: VectorDiff ;
2121use futures_util:: { FutureExt , StreamExt } ;
2222use matrix_sdk:: {
23- config:: SyncSettings , room:: edit:: EditedContent , test_utils:: logged_in_client_with_server,
23+ config:: { StoreConfig , SyncSettings } ,
24+ linked_chunk:: { ChunkIdentifier , Update } ,
25+ room:: edit:: EditedContent ,
26+ test_utils:: { logged_in_client_with_server, mocks:: MatrixMockServer } ,
2427 Client ,
2528} ;
29+ use matrix_sdk_base:: event_cache:: {
30+ store:: { EventCacheStore , MemoryStore } ,
31+ Gap ,
32+ } ;
2633use matrix_sdk_test:: {
2734 async_test, event_factory:: EventFactory , mocks:: mock_encryption_state, JoinedRoomBuilder ,
2835 SyncResponseBuilder , ALICE , BOB ,
@@ -46,7 +53,7 @@ use ruma::{
4653 MessageType , RoomMessageEventContent , RoomMessageEventContentWithoutRelation ,
4754 TextMessageEventContent ,
4855 } ,
49- AnyMessageLikeEventContent , AnyTimelineEvent ,
56+ AnyMessageLikeEventContent , AnyStateEvent , AnyTimelineEvent ,
5057 } ,
5158 owned_event_id, room_id,
5259 serde:: Raw ,
@@ -57,7 +64,7 @@ use stream_assert::assert_next_matches;
5764use tokio:: { task:: yield_now, time:: sleep} ;
5865use wiremock:: {
5966 matchers:: { header, method, path_regex} ,
60- Mock , MockServer , ResponseTemplate ,
67+ Mock , ResponseTemplate ,
6168} ;
6269
6370use crate :: mock_sync;
@@ -851,69 +858,77 @@ async fn test_edit_local_echo_with_unsupported_content() {
851858
852859struct PendingEditHelper {
853860 client : Client ,
854- server : MockServer ,
861+ server : MatrixMockServer ,
855862 timeline : Timeline ,
856- sync_builder : SyncResponseBuilder ,
857- sync_settings : SyncSettings ,
858863 room_id : OwnedRoomId ,
859864}
860865
861866impl PendingEditHelper {
862867 async fn new ( ) -> Self {
863868 let room_id = room_id ! ( "!a98sd12bjh:example.org" ) ;
864- let ( client, server) = logged_in_client_with_server ( ) . await ;
865- let sync_settings = SyncSettings :: new ( ) . timeout ( Duration :: from_millis ( 3000 ) ) ;
866-
867- let mut sync_builder = SyncResponseBuilder :: new ( ) ;
868- sync_builder. add_joined_room ( JoinedRoomBuilder :: new ( room_id) ) ;
869869
870- mock_sync ( & server, sync_builder. build_json_sync_response ( ) , None ) . await ;
871- let _response = client. sync_once ( sync_settings. clone ( ) ) . await . unwrap ( ) ;
872- server. reset ( ) . await ;
870+ let event_cache_store = Arc :: new ( MemoryStore :: new ( ) ) ;
871+ let server = MatrixMockServer :: new ( ) . await ;
873872
874- mock_encryption_state ( & server, false ) . await ;
873+ let client = server
874+ . client_builder ( )
875+ . store_config (
876+ StoreConfig :: new ( "hodor" . to_owned ( ) ) . event_cache_store ( event_cache_store. clone ( ) ) ,
877+ )
878+ . build ( )
879+ . await ;
875880
876881 {
877882 // Fill the initial prev-batch token to avoid waiting for it later.
878883 let ec = client. event_cache ( ) ;
879884 ec. subscribe ( ) . unwrap ( ) ;
880- ec. add_initial_events ( room_id, vec ! [ ] , Some ( "prev-batch-token" . to_owned ( ) ) )
885+ ec. enable_storage ( ) . unwrap ( ) ;
886+
887+ event_cache_store
888+ . handle_linked_chunk_updates (
889+ room_id,
890+ vec ! [
891+ // Maintain the invariant that the first chunk is an items.
892+ Update :: NewItemsChunk {
893+ previous: None ,
894+ new: ChunkIdentifier :: new( 0 ) ,
895+ next: None ,
896+ } ,
897+ // Mind the gap!
898+ Update :: NewGapChunk {
899+ previous: Some ( ChunkIdentifier :: new( 0 ) ) ,
900+ new: ChunkIdentifier :: new( 1 ) ,
901+ next: None ,
902+ gap: Gap { prev_token: "prev-batch-token" . to_owned( ) } ,
903+ } ,
904+ ] ,
905+ )
881906 . await
882907 . unwrap ( ) ;
883908 }
884909
910+ server. sync_joined_room ( & client, room_id) . await ;
911+ server. mock_room_state_encryption ( ) . plain ( ) . mount ( ) . await ;
912+
885913 let room = client. get_room ( room_id) . unwrap ( ) ;
886914 let timeline = room. timeline ( ) . await . unwrap ( ) ;
887915
888- Self { client, server, timeline, sync_builder , sync_settings , room_id : room_id. to_owned ( ) }
916+ Self { client, server, timeline, room_id : room_id. to_owned ( ) }
889917 }
890918
891919 async fn handle_sync ( & mut self , joined_room_builder : JoinedRoomBuilder ) {
892- self . sync_builder . add_joined_room ( joined_room_builder) ;
893-
894- mock_sync ( & self . server , self . sync_builder . build_json_sync_response ( ) , None ) . await ;
895- let _response = self . client . sync_once ( self . sync_settings . clone ( ) ) . await . unwrap ( ) ;
896-
897- self . server . reset ( ) . await ;
920+ self . server . sync_room ( & self . client , joined_room_builder) . await ;
898921 }
899922
900923 async fn handle_backpagination ( & mut self , events : Vec < Raw < AnyTimelineEvent > > , batch_size : u16 ) {
901- Mock :: given ( method ( "GET" ) )
902- . and ( path_regex ( r"^/_matrix/client/r0/rooms/.*/messages$" ) )
903- . and ( header ( "authorization" , "Bearer 1234" ) )
904- . respond_with ( ResponseTemplate :: new ( 200 ) . set_body_json ( json ! ( {
905- "start" : "123" ,
906- "end" : "yolo" ,
907- "chunk" : events,
908- "state" : [ ]
909- } ) ) )
910- . expect ( 1 )
911- . mount ( & self . server )
924+ self . server
925+ . mock_room_messages ( )
926+ . ok ( "123" . to_owned ( ) , Some ( "yolo" . to_owned ( ) ) , events, Vec :: < Raw < AnyStateEvent > > :: new ( ) )
927+ . mock_once ( )
928+ . mount ( )
912929 . await ;
913930
914931 self . timeline . live_paginate_backwards ( batch_size) . await . unwrap ( ) ;
915-
916- self . server . reset ( ) . await ;
917932 }
918933}
919934
0 commit comments