Per spec, event content is required to be a JSON object. The send endpoints accepted any valid JSON value, including bare strings and arrays. Signed-off-by: Jason Volk <jason@zemos.net>
65 lines
2.3 KiB
Rust
65 lines
2.3 KiB
Rust
#![cfg(feature = "server")]
|
|
|
|
use assert_matches2::assert_matches;
|
|
use ruma_client_api::{message::send_message_event, state::send_state_event};
|
|
use ruma_common::api::{
|
|
IncomingRequest as _,
|
|
error::{DeserializationError, FromHttpRequestError},
|
|
};
|
|
|
|
const ROOM_ID: &str = "!room:server.tld";
|
|
|
|
fn http_put(uri: &str, body: &[u8]) -> http::Request<Vec<u8>> {
|
|
http::Request::builder().method(http::Method::PUT).uri(uri).body(body.to_vec()).unwrap()
|
|
}
|
|
|
|
fn assert_non_object_rejected(err: FromHttpRequestError) {
|
|
assert_matches!(err, FromHttpRequestError::Deserialization(DeserializationError::Json(_)));
|
|
}
|
|
|
|
#[test]
|
|
fn send_message_event_rejects_non_object_body() {
|
|
let path_args = [ROOM_ID, "m.room.message", "txn1"];
|
|
let bodies: &[&[u8]] = &[br#""string""#, br#"["array"]"#, b"42", b"null", b"true"];
|
|
|
|
for body in bodies {
|
|
let req =
|
|
http_put("/_matrix/client/v3/rooms/!room:server.tld/send/m.room.message/txn1", body);
|
|
let err = send_message_event::v3::Request::try_from_http_request(req, &path_args)
|
|
.expect_err(&format!("body {body:?} should be rejected"));
|
|
assert_non_object_rejected(err);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn send_message_event_accepts_object_body() {
|
|
let path_args = [ROOM_ID, "m.room.message", "txn1"];
|
|
let req = http_put(
|
|
"/_matrix/client/v3/rooms/!room:server.tld/send/m.room.message/txn1",
|
|
br#"{"msgtype":"m.text","body":"hi"}"#,
|
|
);
|
|
send_message_event::v3::Request::try_from_http_request(req, &path_args).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn send_state_event_rejects_non_object_body() {
|
|
let path_args = [ROOM_ID, "m.room.topic", ""];
|
|
let bodies: &[&[u8]] = &[br#""string""#, br#"["array"]"#, b"42", b"null", b"true"];
|
|
|
|
for body in bodies {
|
|
let req = http_put("/_matrix/client/v3/rooms/!room:server.tld/state/m.room.topic/", body);
|
|
let err = send_state_event::v3::Request::try_from_http_request(req, &path_args)
|
|
.expect_err(&format!("body {body:?} should be rejected"));
|
|
assert_non_object_rejected(err);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn send_state_event_accepts_object_body() {
|
|
let path_args = [ROOM_ID, "m.room.topic", ""];
|
|
let req = http_put(
|
|
"/_matrix/client/v3/rooms/!room:server.tld/state/m.room.topic/",
|
|
br#"{"topic":"hi"}"#,
|
|
);
|
|
send_state_event::v3::Request::try_from_http_request(req, &path_args).unwrap();
|
|
}
|