Skip to content

Commit ab61077

Browse files
committed
fix(ffi): match the right status code in Client::is_room_alias_available
1 parent 26bee1c commit ab61077

File tree

3 files changed

+110
-16
lines changed

3 files changed

+110
-16
lines changed

bindings/matrix-sdk-ffi/src/client.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,21 +1130,16 @@ impl Client {
11301130
Ok(())
11311131
}
11321132

1133-
/// Checks if a room alias is available in the current homeserver.
1133+
/// Checks if a room alias is not in use yet.
1134+
///
1135+
/// Returns:
1136+
/// - `Ok(true)` if the room alias is available.
1137+
/// - `Ok(false)` if it's not (the resolve alias request returned a `404`
1138+
/// status code).
1139+
/// - An `Err` otherwise.
11341140
pub async fn is_room_alias_available(&self, alias: String) -> Result<bool, ClientError> {
11351141
let alias = RoomAliasId::parse(alias)?;
1136-
match self.inner.resolve_room_alias(&alias).await {
1137-
// The room alias was resolved, so it's already in use.
1138-
Ok(_) => Ok(false),
1139-
Err(HttpError::Reqwest(error)) => {
1140-
match error.status() {
1141-
// The room alias wasn't found, so it's available.
1142-
Some(StatusCode::NOT_FOUND) => Ok(true),
1143-
_ => Err(HttpError::Reqwest(error).into()),
1144-
}
1145-
}
1146-
Err(error) => Err(error.into()),
1147-
}
1142+
self.inner.is_room_alias_available(&alias).await.map_err(Into::into)
11481143
}
11491144
}
11501145

crates/matrix-sdk/src/client/mod.rs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ use ruma::{
5252
get_capabilities::{self, Capabilities},
5353
get_supported_versions,
5454
},
55+
error::ErrorKind,
5556
filter::{create_filter::v3::Request as FilterUploadRequest, FilterDefinition},
5657
knock::knock_room,
5758
membership::{join_room_by_id, join_room_by_id_or_alias},
@@ -1038,6 +1039,27 @@ impl Client {
10381039
self.send(request, None).await
10391040
}
10401041

1042+
/// Checks if a room alias is not in use yet.
1043+
///
1044+
/// Returns:
1045+
/// - `Ok(true)` if the room alias is available.
1046+
/// - `Ok(false)` if it's not (the resolve alias request returned a `404`
1047+
/// status code).
1048+
/// - An `Err` otherwise.
1049+
pub async fn is_room_alias_available(&self, alias: &RoomAliasId) -> HttpResult<bool> {
1050+
match self.resolve_room_alias(alias).await {
1051+
// The room alias was resolved, so it's already in use.
1052+
Ok(_) => Ok(false),
1053+
Err(error) => {
1054+
match error.client_api_error_kind() {
1055+
// The room alias wasn't found, so it's available.
1056+
Some(ErrorKind::NotFound) => Ok(true),
1057+
_ => Err(error),
1058+
}
1059+
}
1060+
}
1061+
}
1062+
10411063
/// Update the homeserver from the login response well-known if needed.
10421064
///
10431065
/// # Arguments
@@ -2328,7 +2350,7 @@ pub(crate) mod tests {
23282350
api::{client::room::create_room::v3::Request as CreateRoomRequest, MatrixVersion},
23292351
assign,
23302352
events::ignored_user_list::IgnoredUserListEventContent,
2331-
owned_room_id, room_id, RoomId, ServerName, UserId,
2353+
owned_room_id, room_alias_id, room_id, RoomId, ServerName, UserId,
23322354
};
23332355
use serde_json::json;
23342356
use tokio::{
@@ -2346,8 +2368,8 @@ pub(crate) mod tests {
23462368
client::WeakClient,
23472369
config::{RequestConfig, SyncSettings},
23482370
test_utils::{
2349-
logged_in_client, no_retry_test_client, set_client_session, test_client_builder,
2350-
test_client_builder_with_server,
2371+
logged_in_client, mocks::MatrixMockServer, no_retry_test_client, set_client_session,
2372+
test_client_builder, test_client_builder_with_server,
23512373
},
23522374
Error,
23532375
};
@@ -2915,4 +2937,42 @@ pub(crate) mod tests {
29152937
.await
29162938
.unwrap_err();
29172939
}
2940+
2941+
#[async_test]
2942+
async fn test_is_room_alias_available_if_alias_is_not_resolved() {
2943+
let server = MatrixMockServer::new().await;
2944+
let client = logged_in_client(Some(server.server().uri())).await;
2945+
2946+
server.mock_room_directory_resolve_alias().not_found().expect(1).mount().await;
2947+
2948+
let ret = client.is_room_alias_available(room_alias_id!("#some_alias:matrix.org")).await;
2949+
assert_matches!(ret, Ok(true));
2950+
}
2951+
2952+
#[async_test]
2953+
async fn test_is_room_alias_available_if_alias_is_resolved() {
2954+
let server = MatrixMockServer::new().await;
2955+
let client = logged_in_client(Some(server.server().uri())).await;
2956+
2957+
server
2958+
.mock_room_directory_resolve_alias()
2959+
.ok("!some_room_id:matrix.org", Vec::new())
2960+
.expect(1)
2961+
.mount()
2962+
.await;
2963+
2964+
let ret = client.is_room_alias_available(room_alias_id!("#some_alias:matrix.org")).await;
2965+
assert_matches!(ret, Ok(false));
2966+
}
2967+
2968+
#[async_test]
2969+
async fn test_is_room_alias_available_if_error_found() {
2970+
let server = MatrixMockServer::new().await;
2971+
let client = logged_in_client(Some(server.server().uri())).await;
2972+
2973+
server.mock_room_directory_resolve_alias().error500().expect(1).mount().await;
2974+
2975+
let ret = client.is_room_alias_available(room_alias_id!("#some_alias:matrix.org")).await;
2976+
assert_matches!(ret, Err(_));
2977+
}
29182978
}

crates/matrix-sdk/src/test_utils/mocks.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,13 @@ impl MatrixMockServer {
201201
.and(header("authorization", "Bearer 1234"));
202202
MockUpload { mock, server: &self.server }
203203
}
204+
205+
/// Create a prebuilt mock for resolving room aliases.
206+
pub fn mock_room_directory_resolve_alias(&self) -> MockResolveRoomAlias<'_> {
207+
let mock =
208+
Mock::given(method("GET")).and(path_regex(r"/_matrix/client/r0/directory/room/.*"));
209+
MockResolveRoomAlias { mock, server: &self.server }
210+
}
204211
}
205212

206213
/// Parameter to [`MatrixMockServer::sync_room`].
@@ -511,3 +518,35 @@ impl<'a> MockUpload<'a> {
511518
MatrixMock { mock: self.mock.respond_with(func), server: self.server }
512519
}
513520
}
521+
522+
/// A prebuilt mock for resolving a room alias.
523+
pub struct MockResolveRoomAlias<'a> {
524+
server: &'a MockServer,
525+
mock: MockBuilder,
526+
}
527+
528+
impl<'a> MockResolveRoomAlias<'a> {
529+
/// Returns a data endpoint with a resolved room alias.
530+
pub fn ok(self, room_id: &str, servers: Vec<String>) -> MatrixMock<'a> {
531+
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({
532+
"room_id": room_id,
533+
"servers": servers,
534+
})));
535+
MatrixMock { server: self.server, mock }
536+
}
537+
538+
/// Returns a data endpoint for a room alias that does not exit.
539+
pub fn not_found(self) -> MatrixMock<'a> {
540+
let mock = self.mock.respond_with(ResponseTemplate::new(404).set_body_json(json!({
541+
"errcode": "M_NOT_FOUND",
542+
"error": "Room alias not found."
543+
})));
544+
MatrixMock { server: self.server, mock }
545+
}
546+
547+
/// Returns a data endpoint with a server error.
548+
pub fn error500(self) -> MatrixMock<'a> {
549+
let mock = self.mock.respond_with(ResponseTemplate::new(500));
550+
MatrixMock { server: self.server, mock }
551+
}
552+
}

0 commit comments

Comments
 (0)