1212// See the License for that specific language governing permissions and
1313// limitations under the License.
1414
15- use matrix_sdk:: { Client , room:: RoomMemberRole } ;
15+ use matrix_sdk:: { Client , RoomState , room:: RoomMemberRole } ;
1616use ruma:: { Int , OwnedRoomId } ;
1717
1818use crate :: spaces:: { Error , SpaceRoom } ;
@@ -45,28 +45,34 @@ impl LeaveSpaceHandle {
4545 let mut rooms = Vec :: new ( ) ;
4646
4747 for room_id in & room_ids {
48- if let Some ( room) = client. get_room ( room_id) {
49- let users_to_power_levels = room. users_with_power_levels ( ) . await ;
50-
51- let is_last_admin = users_to_power_levels
52- . iter ( )
53- . filter ( |( _, power_level) | {
54- let Some ( power_level) = Int :: new ( * * power_level) else {
55- return false ;
56- } ;
57-
58- RoomMemberRole :: suggested_role_for_power_level ( power_level. into ( ) )
59- == RoomMemberRole :: Administrator
60- } )
61- . map ( |p| p. 0 )
62- . collect :: < Vec < _ > > ( )
63- == vec ! [ room. own_user_id( ) ] ;
64-
65- rooms. push ( LeaveSpaceRoom {
66- space_room : SpaceRoom :: new_from_known ( & room, 0 ) ,
67- is_last_admin,
68- } ) ;
48+ let Some ( room) = client. get_room ( room_id) else {
49+ continue ;
50+ } ;
51+
52+ if room. state ( ) != RoomState :: Joined {
53+ continue ;
6954 }
55+
56+ let users_to_power_levels = room. users_with_power_levels ( ) . await ;
57+
58+ let is_last_admin = users_to_power_levels
59+ . iter ( )
60+ . filter ( |( _, power_level) | {
61+ let Some ( power_level) = Int :: new ( * * power_level) else {
62+ return false ;
63+ } ;
64+
65+ RoomMemberRole :: suggested_role_for_power_level ( power_level. into ( ) )
66+ == RoomMemberRole :: Administrator
67+ } )
68+ . map ( |p| p. 0 )
69+ . collect :: < Vec < _ > > ( )
70+ == vec ! [ room. own_user_id( ) ] ;
71+
72+ rooms. push ( LeaveSpaceRoom {
73+ space_room : SpaceRoom :: new_from_known ( & room, 0 ) ,
74+ is_last_admin,
75+ } ) ;
7076 }
7177
7278 Self { client, rooms }
@@ -97,7 +103,10 @@ mod tests {
97103 use std:: collections:: BTreeMap ;
98104
99105 use matrix_sdk:: test_utils:: mocks:: MatrixMockServer ;
100- use matrix_sdk_test:: { JoinedRoomBuilder , async_test, event_factory:: EventFactory } ;
106+ use matrix_sdk_test:: {
107+ InvitedRoomBuilder , JoinedRoomBuilder , LeftRoomBuilder , async_test,
108+ event_factory:: EventFactory ,
109+ } ;
101110 use ruma:: { RoomVersionId , owned_user_id, room_id} ;
102111
103112 use crate :: spaces:: SpaceService ;
@@ -108,7 +117,7 @@ mod tests {
108117 let client = server. client_builder ( ) . build ( ) . await ;
109118 let user_id = client. user_id ( ) . unwrap ( ) ;
110119 let space_service = SpaceService :: new ( client. clone ( ) ) ;
111- let factory = EventFactory :: new ( ) ;
120+ let factory = EventFactory :: new ( ) . sender ( user_id ) ;
112121
113122 server. mock_room_state_encryption ( ) . plain ( ) . mount ( ) . await ;
114123
@@ -117,6 +126,8 @@ mod tests {
117126 let parent_space_id = room_id ! ( "!parent_space:example.org" ) ;
118127 let child_space_id_1 = room_id ! ( "!child_space_1:example.org" ) ;
119128 let child_space_id_2 = room_id ! ( "!child_space_2:example.org" ) ;
129+ let left_room_id = room_id ! ( "!left_room:example.org" ) ;
130+ let invited_room_id = room_id ! ( "!invited_room:example.org" ) ;
120131
121132 let mut power_levels = BTreeMap :: from ( [
122133 ( user_id. to_owned ( ) , 100 . into ( ) ) ,
@@ -130,8 +141,7 @@ mod tests {
130141 . add_state_event ( factory. create ( user_id, RoomVersionId :: V1 ) . with_space_type ( ) )
131142 . add_state_event (
132143 factory
133- . space_parent ( parent_space_id. to_owned ( ) , child_space_id_1. to_owned ( ) )
134- . sender ( user_id) ,
144+ . space_parent ( parent_space_id. to_owned ( ) , child_space_id_1. to_owned ( ) ) ,
135145 )
136146 . add_state_event (
137147 factory. power_levels ( & mut power_levels) . state_key ( "" ) . sender ( user_id) ,
@@ -148,28 +158,35 @@ mod tests {
148158 . add_state_event ( factory. create ( user_id, RoomVersionId :: V1 ) . with_space_type ( ) )
149159 . add_state_event (
150160 factory
151- . space_parent ( parent_space_id. to_owned ( ) , child_space_id_2. to_owned ( ) )
152- . sender ( user_id) ,
161+ . space_parent ( parent_space_id. to_owned ( ) , child_space_id_2. to_owned ( ) ) ,
153162 )
154163 . add_state_event (
155164 factory. power_levels ( & mut power_levels) . state_key ( "" ) . sender ( user_id) ,
156165 ) ,
157166 )
158167 . await ;
168+
169+ server. sync_room ( & client, LeftRoomBuilder :: new ( invited_room_id) ) . await ;
170+ server. sync_room ( & client, InvitedRoomBuilder :: new ( invited_room_id) ) . await ;
171+
159172 server
160173 . sync_room (
161174 & client,
162175 JoinedRoomBuilder :: new ( parent_space_id)
163176 . add_state_event ( factory. create ( user_id, RoomVersionId :: V1 ) . with_space_type ( ) )
164177 . add_state_event (
165178 factory
166- . space_child ( parent_space_id. to_owned ( ) , child_space_id_1. to_owned ( ) )
167- . sender ( user_id) ,
179+ . space_child ( parent_space_id. to_owned ( ) , child_space_id_1. to_owned ( ) ) ,
168180 )
169181 . add_state_event (
170182 factory
171- . space_child ( parent_space_id. to_owned ( ) , child_space_id_2. to_owned ( ) )
172- . sender ( user_id) ,
183+ . space_child ( parent_space_id. to_owned ( ) , child_space_id_2. to_owned ( ) ) ,
184+ )
185+ . add_state_event (
186+ factory. space_child ( parent_space_id. to_owned ( ) , left_room_id. to_owned ( ) ) ,
187+ )
188+ . add_state_event (
189+ factory. space_child ( parent_space_id. to_owned ( ) , invited_room_id. to_owned ( ) ) ,
173190 ) ,
174191 )
175192 . await ;
0 commit comments