Skip to content

Commit 12e358a

Browse files
authored
fix(sdk): Don't overwrite previously added state events in state_event processing
Fixes #4952 . Signed-off-by: Benjamin Kampmann <[email protected]>
1 parent 468e7c3 commit 12e358a

File tree

1 file changed

+50
-10
lines changed

1 file changed

+50
-10
lines changed

crates/matrix-sdk-base/src/response_processors/state_events.rs

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ use super::Context;
2020

2121
/// Collect [`AnySyncStateEvent`].
2222
pub 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

Comments
 (0)