162 lines
4.9 KiB
Rust
162 lines
4.9 KiB
Rust
#![cfg(feature = "unstable-msc3489")]
|
|
|
|
use std::time::Duration;
|
|
|
|
use assert_matches2::assert_matches;
|
|
use js_int::uint;
|
|
use ruma_common::{event_id, room_id, serde::CanBeEmpty, user_id, MilliSecondsSinceUnixEpoch};
|
|
use ruma_events::{
|
|
beacon_info::BeaconInfoEventContent, location::AssetType, AnyStateEvent, StateEvent,
|
|
};
|
|
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
|
|
|
fn get_beacon_info_event_content(
|
|
duration: Option<Duration>,
|
|
ts: Option<MilliSecondsSinceUnixEpoch>,
|
|
) -> BeaconInfoEventContent {
|
|
let description = Some("Kylie's live location".to_owned());
|
|
let duration_or = duration.unwrap_or(Duration::from_secs(60));
|
|
let ts_or = Some(ts.unwrap_or(MilliSecondsSinceUnixEpoch::now()));
|
|
|
|
BeaconInfoEventContent::new(description, duration_or, true, ts_or)
|
|
}
|
|
|
|
fn get_beacon_info_json() -> serde_json::Value {
|
|
json!({
|
|
"org.matrix.msc3488.ts": 1_636_829_458,
|
|
"org.matrix.msc3488.asset": {
|
|
"type": "m.self"
|
|
},
|
|
"timeout": 60_000,
|
|
"description": "Kylie's live location",
|
|
"live": true
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_is_live() {
|
|
let event_content = get_beacon_info_event_content(None, None);
|
|
|
|
assert!(event_content.is_live());
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_is_not_live() {
|
|
let duration = Some(Duration::from_nanos(1));
|
|
let event_content = get_beacon_info_event_content(duration, None);
|
|
|
|
assert!(!event_content.is_live());
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_stop_event() {
|
|
let ts = Some(MilliSecondsSinceUnixEpoch(1_636_829_458_u64.try_into().unwrap()));
|
|
|
|
let mut event_content = get_beacon_info_event_content(None, ts);
|
|
|
|
event_content.stop();
|
|
|
|
assert_eq!(
|
|
to_json_value(&event_content).unwrap(),
|
|
json!({
|
|
"org.matrix.msc3488.ts": 1_636_829_458,
|
|
"org.matrix.msc3488.asset": {
|
|
"type": "m.self"
|
|
},
|
|
"timeout": 60_000,
|
|
"description": "Kylie's live location",
|
|
"live": false
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_start_event() {
|
|
let ts = Some(MilliSecondsSinceUnixEpoch(1_636_829_458_u64.try_into().unwrap()));
|
|
|
|
let mut event_content = BeaconInfoEventContent::new(
|
|
Some("Kylie's live location".to_owned()),
|
|
Duration::from_secs(60),
|
|
false,
|
|
ts,
|
|
);
|
|
|
|
event_content.start();
|
|
|
|
assert_eq!(
|
|
to_json_value(&event_content).unwrap(),
|
|
json!({
|
|
"org.matrix.msc3488.ts": 1_636_829_458,
|
|
"org.matrix.msc3488.asset": {
|
|
"type": "m.self"
|
|
},
|
|
"timeout": 60_000,
|
|
"description": "Kylie's live location",
|
|
"live": true
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_start_event_content_serialization() {
|
|
let ts = Some(MilliSecondsSinceUnixEpoch(1_636_829_458_u64.try_into().unwrap()));
|
|
|
|
let event_content = get_beacon_info_event_content(None, ts);
|
|
|
|
assert_eq!(
|
|
to_json_value(&event_content).unwrap(),
|
|
json!({
|
|
"org.matrix.msc3488.ts": 1_636_829_458,
|
|
"org.matrix.msc3488.asset": {
|
|
"type": "m.self"
|
|
},
|
|
"timeout": 60_000,
|
|
"description": "Kylie's live location",
|
|
"live": true
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_info_start_event_content_deserialization() {
|
|
let json_data = get_beacon_info_json();
|
|
|
|
let event_content: BeaconInfoEventContent = serde_json::from_value(json_data).unwrap();
|
|
|
|
assert_eq!(event_content.description, Some("Kylie's live location".to_owned()));
|
|
assert!(event_content.live);
|
|
assert_eq!(event_content.ts, MilliSecondsSinceUnixEpoch(uint!(1_636_829_458)));
|
|
assert_eq!(event_content.timeout, Duration::from_secs(60));
|
|
assert_eq!(event_content.asset.type_, AssetType::Self_);
|
|
}
|
|
|
|
#[test]
|
|
fn state_event_deserialization() {
|
|
let json_data = json!({
|
|
"content": get_beacon_info_json(),
|
|
"event_id": "$beacon_event_id:example.com",
|
|
"origin_server_ts": 1_636_829_458,
|
|
"room_id": "!roomid:example.com",
|
|
"type": "org.matrix.msc3672.beacon_info",
|
|
"sender": "@example:example.com",
|
|
"state_key": "@example:example.com"
|
|
});
|
|
|
|
let event = from_json_value::<AnyStateEvent>(json_data).unwrap();
|
|
|
|
assert_matches!(event, AnyStateEvent::BeaconInfo(StateEvent::Original(ev)));
|
|
|
|
assert_eq!(ev.content.description, Some("Kylie's live location".to_owned()));
|
|
assert_eq!(ev.content.ts, MilliSecondsSinceUnixEpoch(uint!(1_636_829_458)));
|
|
assert_eq!(ev.content.timeout, Duration::from_secs(60));
|
|
assert_eq!(ev.content.asset.type_, AssetType::Self_);
|
|
assert!(ev.content.live);
|
|
|
|
assert_eq!(ev.event_id, event_id!("$beacon_event_id:example.com"));
|
|
assert_eq!(ev.origin_server_ts, MilliSecondsSinceUnixEpoch(uint!(1_636_829_458)));
|
|
assert_eq!(ev.room_id, room_id!("!roomid:example.com"));
|
|
assert_eq!(ev.sender, user_id!("@example:example.com"));
|
|
assert_eq!(ev.state_key, "@example:example.com");
|
|
assert!(ev.unsigned.is_empty());
|
|
}
|