use assert_matches2::assert_let;
use eyeball_im::VectorDiff;
use matrix_sdk::deserialized_responses::TimelineEvent;
use matrix_sdk_test::{ALICE, BOB, async_test, sync_timeline_event};
use ruma::{
MilliSecondsSinceUnixEpoch,
events::{MessageLikeEventType, StateEventType, room::message::MessageType},
uint,
};
use stream_assert::assert_next_matches;
use super::TestTimeline;
use crate::timeline::TimelineItemContent;
#[async_test]
async fn test_invalid_edit() {
let timeline = TestTimeline::new();
let mut stream = timeline.subscribe_events().await;
let f = &timeline.factory;
timeline.handle_live_event(f.text_msg("test").sender(&ALICE)).await;
let item = assert_next_matches!(stream, VectorDiff::PushBack { value } => value);
let msg = item.content().as_message().unwrap();
assert_eq!(msg.body(), "test");
let msg_event_id = item.event_id().unwrap();
timeline
.handle_live_event(
f.text_msg(" * fake")
.edit(msg_event_id, MessageType::text_plain("fake").into())
.sender(&BOB),
)
.await;
assert_eq!(timeline.controller.items().await.len(), 2);
}
#[async_test]
async fn test_invalid_event_content() {
let timeline = TestTimeline::new();
let mut stream = timeline.subscribe_events().await;
timeline
.handle_live_event(TimelineEvent::from_plaintext(sync_timeline_event!({
"content": {},
"event_id": "$eeG0HA0FAZ37wP8kXlNkxx3I",
"origin_server_ts": 10,
"sender": "@alice:example.org",
"type": "m.room.message",
})))
.await;
let item = assert_next_matches!(stream, VectorDiff::PushBack { value } => value);
assert_eq!(item.sender(), "@alice:example.org");
assert_eq!(item.event_id().unwrap(), "$eeG0HA0FAZ37wP8kXlNkxx3I");
assert_eq!(item.timestamp(), MilliSecondsSinceUnixEpoch(uint!(10)));
assert_let!(TimelineItemContent::FailedToParseMessageLike { event_type, .. } = item.content());
assert_eq!(*event_type, MessageLikeEventType::RoomMessage);
timeline
.handle_live_event(TimelineEvent::from_plaintext(sync_timeline_event!({
"content": {},
"event_id": "$d5G0HA0FAZ37wP8kXlNkxx3I",
"origin_server_ts": 2179,
"sender": "@alice:example.org",
"type": "m.room.member",
"state_key": "@alice:example.org",
})))
.await;
let item = assert_next_matches!(stream, VectorDiff::PushBack { value } => value);
assert_eq!(item.sender(), "@alice:example.org");
assert_eq!(item.event_id().unwrap(), "$d5G0HA0FAZ37wP8kXlNkxx3I");
assert_eq!(item.timestamp(), MilliSecondsSinceUnixEpoch(uint!(2179)));
assert_let!(
TimelineItemContent::FailedToParseState { event_type, state_key, .. } = item.content()
);
assert_eq!(*event_type, StateEventType::RoomMember);
assert_eq!(state_key, "@alice:example.org");
}
#[async_test]
async fn test_invalid_event() {
let timeline = TestTimeline::new();
timeline
.handle_live_event(TimelineEvent::from_plaintext(sync_timeline_event!({
"content": {
"body": "hello world",
"msgtype": "m.text"
},
"event_id": "$eeG0HA0FAZ37wP8kXlNkxx3I",
"origin_server_ts": 10,
"type": "m.room.message",
})))
.await;
assert_eq!(timeline.controller.items().await.len(), 0);
}