Skip to content

Commit 2f21f03

Browse files
authored
Merge pull request #7 from lhjt/fix/presence-param
client-api: fix sync v5 set_presence query parameter
2 parents 1a911eb + c4e3bf0 commit 2f21f03

2 files changed

Lines changed: 110 additions & 0 deletions

File tree

crates/ruma-client-api/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ Improvements:
2020
request and response types; the response fields are now `joined`, `count`
2121
and `next_batch`.
2222

23+
Bug fixes:
24+
25+
- Fix `sync_events::v5::Request::set_presence` being read from / serialized to
26+
the JSON body instead of the query string.
27+
2328
[MSC4383]: https://github.com/matrix-org/matrix-spec-proposals/pull/4383
2429

2530
## 0.23.1

crates/ruma-client-api/src/sync/sync_events/v5.rs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ pub struct Request {
101101
///
102102
/// Defaults to `PresenceState::Online`.
103103
#[serde(default, skip_serializing_if = "ruma_common::serde::is_default")]
104+
#[ruma_api(query)]
104105
pub set_presence: PresenceState,
105106

106107
/// Lists of rooms we are interested by, represented by ranges.
@@ -884,3 +885,107 @@ mod tests {
884885
);
885886
}
886887
}
888+
889+
#[cfg(all(test, feature = "client"))]
890+
mod client_tests {
891+
use std::{borrow::Cow, time::Duration};
892+
893+
use ruma_common::api::{
894+
MatrixVersion, OutgoingRequest as _, SupportedVersions, auth_scheme::SendAccessToken,
895+
};
896+
use serde_json::Value as JsonValue;
897+
898+
use super::{PresenceState, Request};
899+
900+
#[test]
901+
fn serialize_request_presence_query_param() {
902+
let supported = SupportedVersions {
903+
versions: [MatrixVersion::V1_1].into(),
904+
features: Default::default(),
905+
};
906+
let mut request = Request::new();
907+
request.pos = Some("s123".into());
908+
request.set_presence = PresenceState::Offline;
909+
request.timeout = Some(Duration::from_millis(5000));
910+
911+
let req: http::Request<Vec<u8>> = request
912+
.try_into_http_request(
913+
"https://homeserver.tld",
914+
SendAccessToken::IfRequired("auth_tok"),
915+
Cow::Owned(supported),
916+
)
917+
.unwrap();
918+
919+
let uri = req.uri();
920+
let query = uri.query().unwrap();
921+
922+
assert_eq!(uri.path(), "/_matrix/client/unstable/org.matrix.simplified_msc3575/sync");
923+
assert!(query.contains("pos=s123"));
924+
assert!(query.contains("set_presence=offline"));
925+
assert!(query.contains("timeout=5000"));
926+
927+
let body = serde_json::from_slice::<JsonValue>(req.body()).unwrap();
928+
assert!(body.get("set_presence").is_none());
929+
}
930+
}
931+
932+
#[cfg(all(test, feature = "server"))]
933+
mod server_tests {
934+
use std::time::Duration;
935+
936+
use ruma_common::{api::IncomingRequest as _, presence::PresenceState};
937+
938+
use super::Request;
939+
940+
#[test]
941+
fn deserialize_request_presence_query_param() {
942+
let uri = http::Uri::builder()
943+
.scheme("https")
944+
.authority("matrix.org")
945+
.path_and_query(
946+
"/_matrix/client/unstable/org.matrix.simplified_msc3575/sync\
947+
?pos=s123\
948+
&set_presence=offline\
949+
&timeout=5000",
950+
)
951+
.build()
952+
.unwrap();
953+
954+
let req = Request::try_from_http_request(
955+
http::Request::builder()
956+
.method(http::Method::POST)
957+
.uri(uri)
958+
.body(br#"{}"# as &[u8])
959+
.unwrap(),
960+
&[] as &[String],
961+
)
962+
.unwrap();
963+
964+
assert_eq!(req.pos.as_deref(), Some("s123"));
965+
assert_eq!(req.set_presence, PresenceState::Offline);
966+
assert_eq!(req.timeout, Some(Duration::from_millis(5000)));
967+
}
968+
969+
#[test]
970+
fn deserialize_request_presence_defaults_to_online() {
971+
let uri = http::Uri::builder()
972+
.scheme("https")
973+
.authority("matrix.org")
974+
.path_and_query("/_matrix/client/unstable/org.matrix.simplified_msc3575/sync")
975+
.build()
976+
.unwrap();
977+
978+
let req = Request::try_from_http_request(
979+
http::Request::builder()
980+
.method(http::Method::POST)
981+
.uri(uri)
982+
.body(br#"{}"# as &[u8])
983+
.unwrap(),
984+
&[] as &[String],
985+
)
986+
.unwrap();
987+
988+
assert_eq!(req.set_presence, PresenceState::Online);
989+
assert_eq!(req.timeout, None);
990+
}
991+
}

0 commit comments

Comments
 (0)