@@ -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