@@ -20,10 +20,7 @@ use super::Context;
2020
2121/// Collect [`AnySyncStateEvent`].
2222pub mod sync {
23- use std:: {
24- collections:: { BTreeMap , BTreeSet } ,
25- iter,
26- } ;
23+ use std:: { collections:: BTreeSet , iter} ;
2724
2825 use ruma:: {
2926 events:: { room:: member:: MembershipState , AnySyncTimelineEvent } ,
@@ -81,8 +78,6 @@ pub mod sync {
8178 return Ok ( user_ids) ;
8279 }
8380
84- let mut state_events = BTreeMap :: new ( ) ;
85-
8681 for ( raw_event, event) in iter:: zip ( raw_events, events) {
8782 room_info. handle_state_event ( event) ;
8883
@@ -101,14 +96,16 @@ pub mod sync {
10196 profiles:: upsert_or_delete ( context, & room_info. room_id , member) ;
10297 }
10398
104- state_events
99+ context
100+ . state_changes
101+ . state
102+ . entry ( room_info. room_id . to_owned ( ) )
103+ . or_default ( )
105104 . entry ( event. event_type ( ) )
106- . or_insert_with ( BTreeMap :: new )
105+ . or_default ( )
107106 . insert ( event. state_key ( ) . to_owned ( ) , raw_event. clone ( ) ) ;
108107 }
109108
110- context. state_changes . state . insert ( room_info. room_id . clone ( ) , state_events) ;
111-
112109 Ok ( user_ids)
113110 }
114111}
@@ -216,3 +213,46 @@ where
216213 } )
217214 . unzip ( )
218215}
216+
217+ #[ cfg( test) ]
218+ mod tests {
219+ use matrix_sdk_test:: {
220+ async_test, event_factory:: EventFactory , JoinedRoomBuilder , StateTestEvent ,
221+ SyncResponseBuilder , DEFAULT_TEST_ROOM_ID ,
222+ } ;
223+ use ruma:: { event_id, user_id} ;
224+
225+ use crate :: test_utils:: logged_in_base_client;
226+
227+ #[ async_test]
228+ async fn test_state_events_after_sync ( ) {
229+ // Given a room
230+ let user_id = user_id ! ( "@u:u.to" ) ;
231+
232+ let client = logged_in_base_client ( Some ( user_id) ) . await ;
233+ let mut sync_builder = SyncResponseBuilder :: new ( ) ;
234+
235+ let room_name = EventFactory :: new ( )
236+ . sender ( user_id)
237+ . room_topic ( "this is the test topic in the timeline" )
238+ . event_id ( event_id ! ( "$2" ) )
239+ . into_raw_sync ( ) ;
240+
241+ let response = sync_builder
242+ . add_joined_room (
243+ JoinedRoomBuilder :: new ( & DEFAULT_TEST_ROOM_ID )
244+ . add_timeline_event ( room_name)
245+ . add_state_event ( StateTestEvent :: PowerLevels ) ,
246+ )
247+ . build_sync_response ( ) ;
248+ client. receive_sync_response ( response) . await . unwrap ( ) ;
249+
250+ let room = client. get_room ( & DEFAULT_TEST_ROOM_ID ) . expect ( "Just-created room not found!" ) ;
251+
252+ // ensure that we have the power levels
253+ assert ! ( room. power_levels( ) . await . is_ok( ) ) ;
254+
255+ // ensure that we have the topic
256+ assert_eq ! ( room. topic( ) . unwrap( ) , "this is the test topic in the timeline" ) ;
257+ }
258+ }
0 commit comments