Skip to content

Commit d2faa1b

Browse files
zecakehpoljar
authored andcommitted
feat(sdk): Add support for deleting custom profile fields
Signed-off-by: Kévin Commaille <[email protected]>
1 parent ca09298 commit d2faa1b

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

crates/matrix-sdk/src/account.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ use ruma::{
4141
error::ErrorKind,
4242
profile::{
4343
AvatarUrl, DisplayName, ProfileFieldName, ProfileFieldValue, StaticProfileField,
44-
get_profile, get_profile_field, set_avatar_url, set_display_name, set_profile_field,
44+
delete_profile_field, get_profile, get_profile_field, set_avatar_url, set_display_name,
45+
set_profile_field,
4546
},
4647
uiaa::AuthData,
4748
},
@@ -416,6 +417,27 @@ impl Account {
416417
Ok(())
417418
}
418419

420+
/// Delete the given field of our own user's profile.
421+
///
422+
/// [`Client::get_capabilities()`] should be called first to check it the
423+
/// field can be modified on the homeserver.
424+
///
425+
/// # Arguments
426+
///
427+
/// * `field` - The profile field to delete.
428+
///
429+
/// # Returns
430+
///
431+
/// Returns an error if the server doesn't support extended profile fields
432+
/// of if the request fails in some other way.
433+
pub async fn delete_profile_field(&self, field: ProfileFieldName) -> Result<()> {
434+
let user_id = self.client.user_id().ok_or(Error::AuthenticationRequired)?;
435+
let request = delete_profile_field::v3::Request::new(user_id.to_owned(), field);
436+
self.client.send(request).await?;
437+
438+
Ok(())
439+
}
440+
419441
/// Change the password of the account.
420442
///
421443
/// # Arguments

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,17 @@ impl MatrixMockServer {
16451645
.and(path(format!("/_matrix/client/v3/profile/{user_id}/{field}")));
16461646
self.mock_endpoint(mock, SetProfileFieldEndpoint).expect_default_access_token()
16471647
}
1648+
1649+
/// Create a prebuilt mock for the endpoint used to delete a profile field.
1650+
pub fn mock_delete_profile_field(
1651+
&self,
1652+
user_id: &UserId,
1653+
field: ProfileFieldName,
1654+
) -> MockEndpoint<'_, DeleteProfileFieldEndpoint> {
1655+
let mock = Mock::given(method("DELETE"))
1656+
.and(path(format!("/_matrix/client/v3/profile/{user_id}/{field}")));
1657+
self.mock_endpoint(mock, DeleteProfileFieldEndpoint).expect_default_access_token()
1658+
}
16481659
}
16491660

16501661
/// A specification for a push rule ID.
@@ -4710,3 +4721,13 @@ impl<'a> MockEndpoint<'a, SetProfileFieldEndpoint> {
47104721
self.ok_empty_json()
47114722
}
47124723
}
4724+
4725+
/// A prebuilt mock for `DELETE /_matrix/client/*/profile/{user_id}/{key_name}`.
4726+
pub struct DeleteProfileFieldEndpoint;
4727+
4728+
impl<'a> MockEndpoint<'a, DeleteProfileFieldEndpoint> {
4729+
/// Returns a successful empty response.
4730+
pub fn ok(self) -> MatrixMock<'a> {
4731+
self.ok_empty_json()
4732+
}
4733+
}

crates/matrix-sdk/tests/integration/account.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,38 @@ async fn test_set_profile_field() {
153153
account.set_display_name(Some(display_name)).await.unwrap();
154154
account.set_profile_field(ProfileFieldValue::TimeZone(tz.to_owned())).await.unwrap();
155155
}
156+
157+
#[async_test]
158+
async fn test_delete_profile_field() {
159+
let server = MatrixMockServer::new().await;
160+
let client = server.client_builder().server_versions(vec![MatrixVersion::V1_16]).build().await;
161+
let user_id = client.user_id().unwrap();
162+
163+
server
164+
.mock_delete_profile_field(user_id, ProfileFieldName::TimeZone)
165+
.ok()
166+
.mock_once()
167+
.named("delete m.tz profile field")
168+
.mount()
169+
.await;
170+
server
171+
.mock_set_profile_field(user_id, ProfileFieldName::DisplayName)
172+
.ok()
173+
.mock_once()
174+
.named("set displayname profile field")
175+
.mount()
176+
.await;
177+
server
178+
.mock_set_profile_field(user_id, ProfileFieldName::AvatarUrl)
179+
.ok()
180+
.mock_once()
181+
.named("set avatar_url profile field")
182+
.mount()
183+
.await;
184+
185+
let account = client.account();
186+
187+
account.set_avatar_url(None).await.unwrap();
188+
account.set_display_name(None).await.unwrap();
189+
account.delete_profile_field(ProfileFieldName::TimeZone).await.unwrap();
190+
}

0 commit comments

Comments
 (0)