@@ -10,6 +10,7 @@ use futures_util::{pin_mut, FutureExt, StreamExt as _};
10
10
use matrix_sdk:: {
11
11
bytes:: Bytes ,
12
12
config:: SyncSettings ,
13
+ room_preview:: RoomPreview ,
13
14
ruma:: {
14
15
api:: client:: {
15
16
receipt:: create_receipt:: v3:: ReceiptType ,
@@ -29,6 +30,8 @@ use matrix_sdk::{
29
30
AnySyncMessageLikeEvent , InitialStateEvent , Mentions , StateEventType ,
30
31
} ,
31
32
mxc_uri,
33
+ space:: SpaceRoomJoinRule ,
34
+ RoomId ,
32
35
} ,
33
36
Client , RoomInfo , RoomListEntry , RoomMemberships , RoomState , SlidingSyncList , SlidingSyncMode ,
34
37
} ;
@@ -1082,14 +1085,24 @@ async fn test_room_preview() -> Result<()> {
1082
1085
InitialStateEvent :: new( RoomHistoryVisibilityEventContent :: new( HistoryVisibility :: WorldReadable ) ) . to_raw_any( ) ,
1083
1086
InitialStateEvent :: new( RoomJoinRulesEventContent :: new( JoinRule :: Invite ) ) . to_raw_any( ) ,
1084
1087
] ,
1085
- //TODO: this doesn't allow preview => could be tested!
1086
- //preset: Some(RoomPreset::PrivateChat),
1087
1088
} ) )
1088
1089
. await ?;
1089
1090
1090
1091
room. set_avatar_url ( mxc_uri ! ( "mxc://localhost/alice" ) , None ) . await ?;
1091
1092
1093
+ // Alice creates another room, and still doesn't invite Bob.
1094
+ let private_room = alice
1095
+ . create_room ( assign ! ( CreateRoomRequest :: new( ) , {
1096
+ name: Some ( "Alice's Room 2" . to_owned( ) ) ,
1097
+ initial_state: vec![
1098
+ InitialStateEvent :: new( RoomHistoryVisibilityEventContent :: new( HistoryVisibility :: Shared ) ) . to_raw_any( ) ,
1099
+ InitialStateEvent :: new( RoomJoinRulesEventContent :: new( JoinRule :: Public ) ) . to_raw_any( ) ,
1100
+ ] ,
1101
+ } ) )
1102
+ . await ?;
1103
+
1092
1104
let room_id = room. room_id ( ) ;
1105
+ let private_room_id = private_room. room_id ( ) ;
1093
1106
1094
1107
// Wait for Alice's stream to stabilize (stop updating when we haven't received
1095
1108
// successful updates for more than 2 seconds).
@@ -1104,49 +1117,76 @@ async fn test_room_preview() -> Result<()> {
1104
1117
}
1105
1118
}
1106
1119
1107
- let preview = alice. get_room_preview ( room_id) . await ?;
1108
- assert_eq ! ( preview. canonical_alias. unwrap( ) . alias( ) , room_alias) ;
1109
- assert_eq ! ( preview. name. unwrap( ) , "Alice's Room" ) ;
1110
- assert_eq ! ( preview. topic. unwrap( ) , "Discussing Alice's Topic" ) ;
1111
- assert_eq ! ( preview. avatar_url. unwrap( ) , mxc_uri!( "mxc://localhost/alice" ) ) ;
1112
- assert_eq ! ( preview. num_joined_members, 1 ) ;
1113
- assert ! ( preview. room_type. is_none( ) ) ;
1114
- // Because of the preset:
1115
- assert_eq ! ( preview. join_rule, JoinRule :: Invite ) ;
1116
- assert_eq ! ( preview. history_visibility, HistoryVisibility :: WorldReadable ) ;
1117
- assert_eq ! ( preview. state, Some ( RoomState :: Joined ) ) ;
1120
+ get_room_preview_with_room_state ( & alice, & bob, & room_alias, room_id, private_room_id) . await ;
1121
+ get_room_preview_with_room_summary ( & alice, & bob, & room_alias, room_id, private_room_id) . await ;
1118
1122
1119
- // Bob definitely doesn't know about the room, but they can get a preview of the
1120
- // room too.
1121
- let preview = bob. get_room_preview ( room_id) . await ?;
1123
+ {
1124
+ // Dummy test for `Client::get_room_preview` which may call one or the other
1125
+ // methods.
1126
+ let preview = alice. get_room_preview ( room_id) . await . unwrap ( ) ;
1127
+ assert_room_preview ( & preview, & room_alias) ;
1128
+ assert_eq ! ( preview. state, Some ( RoomState :: Joined ) ) ;
1129
+ }
1122
1130
1123
- assert_eq ! ( preview. canonical_alias. unwrap( ) . alias( ) , room_alias) ;
1124
- assert_eq ! ( preview. name. unwrap( ) , "Alice's Room" ) ;
1125
- assert_eq ! ( preview. topic. unwrap( ) , "Discussing Alice's Topic" ) ;
1126
- assert_eq ! ( preview. avatar_url. unwrap( ) , mxc_uri!( "mxc://localhost/alice" ) ) ;
1131
+ Ok ( ( ) )
1132
+ }
1133
+
1134
+ fn assert_room_preview ( preview : & RoomPreview , room_alias : & str ) {
1135
+ assert_eq ! ( preview. canonical_alias. as_ref( ) . unwrap( ) . alias( ) , room_alias) ;
1136
+ assert_eq ! ( preview. name. as_ref( ) . unwrap( ) , "Alice's Room" ) ;
1137
+ assert_eq ! ( preview. topic. as_ref( ) . unwrap( ) , "Discussing Alice's Topic" ) ;
1138
+ assert_eq ! ( preview. avatar_url. as_ref( ) . unwrap( ) , mxc_uri!( "mxc://localhost/alice" ) ) ;
1127
1139
assert_eq ! ( preview. num_joined_members, 1 ) ;
1128
1140
assert ! ( preview. room_type. is_none( ) ) ;
1129
- assert_eq ! ( preview. join_rule, JoinRule :: Invite ) ;
1130
- assert_eq ! ( preview. history_visibility, HistoryVisibility :: WorldReadable ) ;
1141
+ assert_eq ! ( preview. join_rule, SpaceRoomJoinRule :: Invite ) ;
1142
+ assert ! ( preview. is_world_readable) ;
1143
+ }
1131
1144
1132
- // Only difference with Alice's room is here: since Bob hasn't joined the room,
1133
- // they don't have any associated room state.
1134
- assert_eq ! ( preview. state, None ) ;
1145
+ async fn get_room_preview_with_room_state (
1146
+ alice : & Client ,
1147
+ bob : & Client ,
1148
+ room_alias : & str ,
1149
+ room_id : & RoomId ,
1150
+ public_no_history_room_id : & RoomId ,
1151
+ ) {
1152
+ // Alice has joined the room, so they get the full details.
1153
+ let preview = RoomPreview :: from_state_events ( alice, room_id) . await . unwrap ( ) ;
1154
+ assert_room_preview ( & preview, room_alias) ;
1155
+ assert_eq ! ( preview. state, Some ( RoomState :: Joined ) ) ;
1135
1156
1136
- // Now Alice creates another room, with a private preset, and still doesn't
1137
- // invite Bob.
1138
- let room = alice
1139
- . create_room ( assign ! ( CreateRoomRequest :: new( ) , {
1140
- initial_state: vec![
1141
- InitialStateEvent :: new( RoomHistoryVisibilityEventContent :: new( HistoryVisibility :: Shared ) ) . to_raw_any( ) ,
1142
- InitialStateEvent :: new( RoomJoinRulesEventContent :: new( JoinRule :: Invite ) ) . to_raw_any( ) ,
1143
- ] ,
1144
- } ) )
1145
- . await ?;
1157
+ // Bob definitely doesn't know about the room, but they can get a preview of the
1158
+ // room too.
1159
+ let preview = RoomPreview :: from_state_events ( bob, room_id) . await . unwrap ( ) ;
1160
+ assert_room_preview ( & preview, room_alias) ;
1161
+ assert ! ( preview. state. is_none( ) ) ;
1146
1162
1147
- // So Bob can't preview it.
1148
- let preview_result = bob. get_room_preview ( room. room_id ( ) ) . await ;
1163
+ // Bob can't preview the second room, because its history visibility is neither
1164
+ // world-readable, nor have they joined the room before.
1165
+ let preview_result = RoomPreview :: from_state_events ( bob, public_no_history_room_id) . await ;
1149
1166
assert_eq ! ( preview_result. unwrap_err( ) . as_client_api_error( ) . unwrap( ) . status_code, 403 ) ;
1167
+ }
1150
1168
1151
- Ok ( ( ) )
1169
+ async fn get_room_preview_with_room_summary (
1170
+ alice : & Client ,
1171
+ bob : & Client ,
1172
+ room_alias : & str ,
1173
+ room_id : & RoomId ,
1174
+ public_no_history_room_id : & RoomId ,
1175
+ ) {
1176
+ // Alice has joined the room, so they get the full details.
1177
+ let preview = RoomPreview :: from_room_summary ( alice, room_id) . await . unwrap ( ) ;
1178
+ assert_room_preview ( & preview, room_alias) ;
1179
+ assert_eq ! ( preview. state, Some ( RoomState :: Joined ) ) ;
1180
+
1181
+ // Bob definitely doesn't know about the room, but they can get a preview of the
1182
+ // room too.
1183
+ let preview = RoomPreview :: from_room_summary ( bob, room_id) . await . unwrap ( ) ;
1184
+ assert_room_preview ( & preview, room_alias) ;
1185
+ assert ! ( preview. state. is_none( ) ) ;
1186
+
1187
+ // Bob can preview the second room with the room summary (because its join rule
1188
+ // is set to public, or because Alice is a member of that room).
1189
+ let preview = RoomPreview :: from_room_summary ( bob, public_no_history_room_id) . await . unwrap ( ) ;
1190
+ assert_eq ! ( preview. name. unwrap( ) , "Alice's Room 2" ) ;
1191
+ assert ! ( preview. state. is_none( ) ) ;
1152
1192
}
0 commit comments