state-res: Move tests/utils.rs to src/test_utils.rs
This commit is contained in:
parent
6b1f027b88
commit
0a93780e83
@ -20,6 +20,8 @@ mod error;
|
|||||||
pub mod event_auth;
|
pub mod event_auth;
|
||||||
pub mod room_version;
|
pub mod room_version;
|
||||||
mod state_event;
|
mod state_event;
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub mod test_utils;
|
||||||
|
|
||||||
pub use error::{Error, Result};
|
pub use error::{Error, Result};
|
||||||
pub use event_auth::{auth_check, auth_types_for_event};
|
pub use event_auth::{auth_check, auth_types_for_event};
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::{HashMap, HashSet},
|
collections::{BTreeMap, HashMap, HashSet},
|
||||||
convert::{TryFrom, TryInto},
|
convert::{TryFrom, TryInto},
|
||||||
sync::{
|
sync::{
|
||||||
atomic::{AtomicU64, Ordering::SeqCst},
|
atomic::{AtomicU64, Ordering::SeqCst},
|
||||||
@ -10,7 +8,6 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use js_int::uint;
|
use js_int::uint;
|
||||||
use maplit::{btreemap, hashset};
|
|
||||||
use ruma_common::MilliSecondsSinceUnixEpoch;
|
use ruma_common::MilliSecondsSinceUnixEpoch;
|
||||||
use ruma_events::{
|
use ruma_events::{
|
||||||
pdu::{EventHash, Pdu, RoomV3Pdu},
|
pdu::{EventHash, Pdu, RoomV3Pdu},
|
||||||
@ -21,10 +18,10 @@ use ruma_events::{
|
|||||||
EventType,
|
EventType,
|
||||||
};
|
};
|
||||||
use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId};
|
use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId};
|
||||||
use ruma_state_res::{self as state_res, auth_types_for_event, Error, Event, Result, StateMap};
|
|
||||||
use serde_json::{json, Value as JsonValue};
|
use serde_json::{json, Value as JsonValue};
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
use tracing_subscriber as tracer;
|
|
||||||
|
use crate::{self as state_res, auth_types_for_event, Error, Event, Result, StateMap};
|
||||||
|
|
||||||
pub use event::StateEvent;
|
pub use event::StateEvent;
|
||||||
|
|
||||||
@ -54,7 +51,7 @@ pub fn do_check(
|
|||||||
// Create the DB of events that led up to this point
|
// Create the DB of events that led up to this point
|
||||||
// TODO maybe clean up some of these clones it is just tests but...
|
// TODO maybe clean up some of these clones it is just tests but...
|
||||||
for ev in init_events.values().chain(events) {
|
for ev in init_events.values().chain(events) {
|
||||||
graph.insert(ev.event_id().clone(), hashset![]);
|
graph.insert(ev.event_id().clone(), HashSet::new());
|
||||||
fake_event_map.insert(ev.event_id().clone(), ev.clone());
|
fake_event_map.insert(ev.event_id().clone(), ev.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,6 +277,86 @@ impl<E: Event> TestStore<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A StateStore implementation for testing
|
||||||
|
impl TestStore<StateEvent> {
|
||||||
|
pub fn set_up(&mut self) -> (StateMap<EventId>, StateMap<EventId>, StateMap<EventId>) {
|
||||||
|
let create_event = to_pdu_event::<EventId>(
|
||||||
|
"CREATE",
|
||||||
|
alice(),
|
||||||
|
EventType::RoomCreate,
|
||||||
|
Some(""),
|
||||||
|
json!({ "creator": alice() }),
|
||||||
|
&[],
|
||||||
|
&[],
|
||||||
|
);
|
||||||
|
let cre = create_event.event_id().clone();
|
||||||
|
self.0.insert(cre.clone(), Arc::clone(&create_event));
|
||||||
|
|
||||||
|
let alice_mem = to_pdu_event(
|
||||||
|
"IMA",
|
||||||
|
alice(),
|
||||||
|
EventType::RoomMember,
|
||||||
|
Some(alice().to_string().as_str()),
|
||||||
|
member_content_join(),
|
||||||
|
&[cre.clone()],
|
||||||
|
&[cre.clone()],
|
||||||
|
);
|
||||||
|
self.0.insert(alice_mem.event_id().clone(), Arc::clone(&alice_mem));
|
||||||
|
|
||||||
|
let join_rules = to_pdu_event(
|
||||||
|
"IJR",
|
||||||
|
alice(),
|
||||||
|
EventType::RoomJoinRules,
|
||||||
|
Some(""),
|
||||||
|
json!({ "join_rule": JoinRule::Public }),
|
||||||
|
&[cre.clone(), alice_mem.event_id().clone()],
|
||||||
|
&[alice_mem.event_id().clone()],
|
||||||
|
);
|
||||||
|
self.0.insert(join_rules.event_id().clone(), join_rules.clone());
|
||||||
|
|
||||||
|
// Bob and Charlie join at the same time, so there is a fork
|
||||||
|
// this will be represented in the state_sets when we resolve
|
||||||
|
let bob_mem = to_pdu_event(
|
||||||
|
"IMB",
|
||||||
|
bob(),
|
||||||
|
EventType::RoomMember,
|
||||||
|
Some(bob().to_string().as_str()),
|
||||||
|
member_content_join(),
|
||||||
|
&[cre.clone(), join_rules.event_id().clone()],
|
||||||
|
&[join_rules.event_id().clone()],
|
||||||
|
);
|
||||||
|
self.0.insert(bob_mem.event_id().clone(), bob_mem.clone());
|
||||||
|
|
||||||
|
let charlie_mem = to_pdu_event(
|
||||||
|
"IMC",
|
||||||
|
charlie(),
|
||||||
|
EventType::RoomMember,
|
||||||
|
Some(charlie().to_string().as_str()),
|
||||||
|
member_content_join(),
|
||||||
|
&[cre, join_rules.event_id().clone()],
|
||||||
|
&[join_rules.event_id().clone()],
|
||||||
|
);
|
||||||
|
self.0.insert(charlie_mem.event_id().clone(), charlie_mem.clone());
|
||||||
|
|
||||||
|
let state_at_bob = [&create_event, &alice_mem, &join_rules, &bob_mem]
|
||||||
|
.iter()
|
||||||
|
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
||||||
|
.collect::<StateMap<_>>();
|
||||||
|
|
||||||
|
let state_at_charlie = [&create_event, &alice_mem, &join_rules, &charlie_mem]
|
||||||
|
.iter()
|
||||||
|
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
||||||
|
.collect::<StateMap<_>>();
|
||||||
|
|
||||||
|
let expected = [&create_event, &alice_mem, &join_rules, &bob_mem, &charlie_mem]
|
||||||
|
.iter()
|
||||||
|
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
||||||
|
.collect::<StateMap<_>>();
|
||||||
|
|
||||||
|
(state_at_bob, state_at_charlie, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn event_id(id: &str) -> EventId {
|
pub fn event_id(id: &str) -> EventId {
|
||||||
if id.contains('$') {
|
if id.contains('$') {
|
||||||
return EventId::try_from(id).unwrap();
|
return EventId::try_from(id).unwrap();
|
||||||
@ -336,14 +413,14 @@ pub fn to_init_pdu_event(
|
|||||||
kind: ev_type,
|
kind: ev_type,
|
||||||
content,
|
content,
|
||||||
redacts: None,
|
redacts: None,
|
||||||
unsigned: btreemap! {},
|
unsigned: BTreeMap::new(),
|
||||||
#[cfg(not(feature = "unstable-pre-spec"))]
|
#[cfg(not(feature = "unstable-pre-spec"))]
|
||||||
origin: "foo".into(),
|
origin: "foo".into(),
|
||||||
auth_events: vec![],
|
auth_events: vec![],
|
||||||
prev_events: vec![],
|
prev_events: vec![],
|
||||||
depth: uint!(0),
|
depth: uint!(0),
|
||||||
hashes: EventHash::new("".to_owned()),
|
hashes: EventHash::new("".to_owned()),
|
||||||
signatures: btreemap! {},
|
signatures: BTreeMap::new(),
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -376,14 +453,14 @@ where
|
|||||||
kind: ev_type,
|
kind: ev_type,
|
||||||
content,
|
content,
|
||||||
redacts: None,
|
redacts: None,
|
||||||
unsigned: btreemap! {},
|
unsigned: BTreeMap::new(),
|
||||||
#[cfg(not(feature = "unstable-pre-spec"))]
|
#[cfg(not(feature = "unstable-pre-spec"))]
|
||||||
origin: "foo".into(),
|
origin: "foo".into(),
|
||||||
auth_events,
|
auth_events,
|
||||||
prev_events,
|
prev_events,
|
||||||
depth: uint!(0),
|
depth: uint!(0),
|
||||||
hashes: EventHash::new("".to_owned()),
|
hashes: EventHash::new("".to_owned()),
|
||||||
signatures: btreemap! {},
|
signatures: BTreeMap::new(),
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -391,10 +468,6 @@ where
|
|||||||
// all graphs start with these input events
|
// all graphs start with these input events
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub fn INITIAL_EVENTS() -> HashMap<EventId, Arc<StateEvent>> {
|
pub fn INITIAL_EVENTS() -> HashMap<EventId, Arc<StateEvent>> {
|
||||||
// this is always called so we can init the logger here
|
|
||||||
let _ = LOGGER
|
|
||||||
.call_once(|| tracer::fmt().with_env_filter(tracer::EnvFilter::from_default_env()).init());
|
|
||||||
|
|
||||||
vec![
|
vec![
|
||||||
to_pdu_event::<EventId>(
|
to_pdu_event::<EventId>(
|
||||||
"CREATE",
|
"CREATE",
|
||||||
@ -496,10 +569,11 @@ pub mod event {
|
|||||||
EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UserId,
|
EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UserId,
|
||||||
};
|
};
|
||||||
use ruma_serde::CanonicalJsonObject;
|
use ruma_serde::CanonicalJsonObject;
|
||||||
use ruma_state_res::Event;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value as JsonValue;
|
use serde_json::Value as JsonValue;
|
||||||
|
|
||||||
|
use crate::Event;
|
||||||
|
|
||||||
impl Event for StateEvent {
|
impl Event for StateEvent {
|
||||||
fn event_id(&self) -> &EventId {
|
fn event_id(&self) -> &EventId {
|
||||||
self.event_id()
|
self.event_id()
|
||||||
@ -715,7 +789,7 @@ pub mod event {
|
|||||||
&self,
|
&self,
|
||||||
) -> BTreeMap<Box<ServerName>, BTreeMap<ServerSigningKeyId, String>> {
|
) -> BTreeMap<Box<ServerName>, BTreeMap<ServerSigningKeyId, String>> {
|
||||||
match &self.rest {
|
match &self.rest {
|
||||||
Pdu::RoomV1Pdu(_) => maplit::btreemap! {},
|
Pdu::RoomV1Pdu(_) => BTreeMap::new(),
|
||||||
Pdu::RoomV3Pdu(ev) => ev.signatures.clone(),
|
Pdu::RoomV3Pdu(ev) => ev.signatures.clone(),
|
||||||
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
#[cfg(not(feature = "unstable-exhaustive-types"))]
|
||||||
_ => unreachable!("new PDU version"),
|
_ => unreachable!("new PDU version"),
|
@ -1,13 +1,15 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ruma_events::EventType;
|
use ruma_events::EventType;
|
||||||
use ruma_state_res::{event_auth::valid_membership_change, StateMap};
|
use ruma_state_res::{
|
||||||
|
event_auth::valid_membership_change,
|
||||||
mod utils;
|
test_utils::{alice, charlie, event_id, member_content_ban, to_pdu_event, INITIAL_EVENTS},
|
||||||
use utils::{alice, charlie, event_id, member_content_ban, to_pdu_event, INITIAL_EVENTS};
|
StateMap,
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ban_pass() {
|
fn test_ban_pass() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
let events = INITIAL_EVENTS();
|
let events = INITIAL_EVENTS();
|
||||||
|
|
||||||
let prev = events.values().find(|ev| ev.event_id().as_str().contains("IMC")).map(Arc::clone);
|
let prev = events.values().find(|ev| ev.event_id().as_str().contains("IMC")).map(Arc::clone);
|
||||||
@ -40,6 +42,7 @@ fn test_ban_pass() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ban_fail() {
|
fn test_ban_fail() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
let events = INITIAL_EVENTS();
|
let events = INITIAL_EVENTS();
|
||||||
|
|
||||||
let prev = events.values().find(|ev| ev.event_id().as_str().contains("IMC")).map(Arc::clone);
|
let prev = events.values().find(|ev| ev.event_id().as_str().contains("IMC")).map(Arc::clone);
|
||||||
|
@ -5,12 +5,13 @@ use std::{
|
|||||||
|
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
use ruma_events::EventType;
|
use ruma_events::EventType;
|
||||||
use ruma_state_res::{self as state_res, is_power_event, room_version::RoomVersion, StateMap};
|
use ruma_state_res::{
|
||||||
|
self as state_res, is_power_event, room_version::RoomVersion, test_utils::INITIAL_EVENTS,
|
||||||
mod utils;
|
StateMap,
|
||||||
use utils::INITIAL_EVENTS;
|
};
|
||||||
|
|
||||||
fn test_event_sort() {
|
fn test_event_sort() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
let events = INITIAL_EVENTS();
|
let events = INITIAL_EVENTS();
|
||||||
|
|
||||||
let event_map = events
|
let event_map = events
|
||||||
|
@ -4,18 +4,20 @@ use std::{collections::HashMap, sync::Arc};
|
|||||||
|
|
||||||
use ruma_events::EventType;
|
use ruma_events::EventType;
|
||||||
use ruma_identifiers::{EventId, RoomVersionId};
|
use ruma_identifiers::{EventId, RoomVersionId};
|
||||||
use ruma_state_res::{self as state_res, EventMap, StateMap};
|
use ruma_state_res::{
|
||||||
|
self as state_res,
|
||||||
|
test_utils::{
|
||||||
|
alice, bob, do_check, ella, event_id, member_content_ban, member_content_join, room_id,
|
||||||
|
to_pdu_event, zara, StateEvent, TestStore, INITIAL_EVENTS,
|
||||||
|
},
|
||||||
|
EventMap, StateMap,
|
||||||
|
};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
mod utils;
|
|
||||||
use utils::{
|
|
||||||
alice, bob, do_check, ella, event_id, member_content_ban, member_content_join, room_id,
|
|
||||||
to_pdu_event, zara, StateEvent, TestStore, INITIAL_EVENTS,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ban_with_auth_chains() {
|
fn ban_with_auth_chains() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
let ban = BAN_STATE_SET();
|
let ban = BAN_STATE_SET();
|
||||||
|
|
||||||
let edges = vec![vec!["END", "MB", "PA", "START"], vec!["END", "IME", "MB"]]
|
let edges = vec![vec!["END", "MB", "PA", "START"], vec!["END", "IME", "MB"]]
|
||||||
@ -30,6 +32,7 @@ fn ban_with_auth_chains() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ban_with_auth_chains2() {
|
fn ban_with_auth_chains2() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
let init = INITIAL_EVENTS();
|
let init = INITIAL_EVENTS();
|
||||||
let ban = BAN_STATE_SET();
|
let ban = BAN_STATE_SET();
|
||||||
|
|
||||||
|
@ -4,19 +4,21 @@ use js_int::uint;
|
|||||||
use maplit::{hashmap, hashset};
|
use maplit::{hashmap, hashset};
|
||||||
use ruma_common::MilliSecondsSinceUnixEpoch;
|
use ruma_common::MilliSecondsSinceUnixEpoch;
|
||||||
use ruma_events::{room::join_rules::JoinRule, EventType};
|
use ruma_events::{room::join_rules::JoinRule, EventType};
|
||||||
use ruma_identifiers::{EventId, RoomVersionId};
|
use ruma_identifiers::RoomVersionId;
|
||||||
use ruma_state_res::{self as state_res, EventMap, StateMap};
|
use ruma_state_res::{
|
||||||
use serde_json::json;
|
self as state_res,
|
||||||
use tracing_subscriber as tracer;
|
test_utils::{
|
||||||
|
|
||||||
mod utils;
|
|
||||||
use utils::{
|
|
||||||
alice, bob, charlie, do_check, ella, event_id, member_content_ban, member_content_join,
|
alice, bob, charlie, do_check, ella, event_id, member_content_ban, member_content_join,
|
||||||
room_id, to_init_pdu_event, to_pdu_event, zara, StateEvent, TestStore, LOGGER,
|
room_id, to_init_pdu_event, zara, StateEvent, TestStore,
|
||||||
|
},
|
||||||
|
EventMap,
|
||||||
};
|
};
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ban_vs_power_level() {
|
fn ban_vs_power_level() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
"PA",
|
"PA",
|
||||||
@ -60,6 +62,8 @@ fn ban_vs_power_level() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn topic_basic() {
|
fn topic_basic() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
@ -100,6 +104,8 @@ fn topic_basic() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn topic_reset() {
|
fn topic_reset() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
@ -131,6 +137,8 @@ fn topic_reset() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn join_rule_evasion() {
|
fn join_rule_evasion() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
"JR",
|
"JR",
|
||||||
@ -160,6 +168,8 @@ fn join_rule_evasion() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn offtopic_power_level() {
|
fn offtopic_power_level() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
"PA",
|
"PA",
|
||||||
@ -196,6 +206,8 @@ fn offtopic_power_level() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn topic_setting() {
|
fn topic_setting() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let events = &[
|
let events = &[
|
||||||
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
to_init_pdu_event("T1", alice(), EventType::RoomTopic, Some(""), json!({})),
|
||||||
to_init_pdu_event(
|
to_init_pdu_event(
|
||||||
@ -240,12 +252,7 @@ fn topic_setting() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_event_map_none() {
|
fn test_event_map_none() {
|
||||||
// This is the only test that does not use `do_check` so we
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
// have to start the logger if this is what we're running.
|
|
||||||
//
|
|
||||||
// to activate logging use `RUST_LOG=debug cargo t one_test_only`
|
|
||||||
let _ = LOGGER
|
|
||||||
.call_once(|| tracer::fmt().with_env_filter(tracer::EnvFilter::from_default_env()).init());
|
|
||||||
|
|
||||||
let mut store = TestStore::<StateEvent>(hashmap! {});
|
let mut store = TestStore::<StateEvent>(hashmap! {});
|
||||||
|
|
||||||
@ -277,6 +284,8 @@ fn test_event_map_none() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_lexicographical_sort() {
|
fn test_lexicographical_sort() {
|
||||||
|
let _ = tracing::subscriber::set_default(tracing_subscriber::fmt().with_test_writer().finish());
|
||||||
|
|
||||||
let graph = hashmap! {
|
let graph = hashmap! {
|
||||||
event_id("l") => hashset![event_id("o")],
|
event_id("l") => hashset![event_id("o")],
|
||||||
event_id("m") => hashset![event_id("n"), event_id("o")],
|
event_id("m") => hashset![event_id("n"), event_id("o")],
|
||||||
@ -298,85 +307,3 @@ fn test_lexicographical_sort() {
|
|||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A StateStore implementation for testing
|
|
||||||
//
|
|
||||||
//
|
|
||||||
impl TestStore<StateEvent> {
|
|
||||||
pub fn set_up(&mut self) -> (StateMap<EventId>, StateMap<EventId>, StateMap<EventId>) {
|
|
||||||
let create_event = to_pdu_event::<EventId>(
|
|
||||||
"CREATE",
|
|
||||||
alice(),
|
|
||||||
EventType::RoomCreate,
|
|
||||||
Some(""),
|
|
||||||
json!({ "creator": alice() }),
|
|
||||||
&[],
|
|
||||||
&[],
|
|
||||||
);
|
|
||||||
let cre = create_event.event_id().clone();
|
|
||||||
self.0.insert(cre.clone(), Arc::clone(&create_event));
|
|
||||||
|
|
||||||
let alice_mem = to_pdu_event(
|
|
||||||
"IMA",
|
|
||||||
alice(),
|
|
||||||
EventType::RoomMember,
|
|
||||||
Some(alice().to_string().as_str()),
|
|
||||||
member_content_join(),
|
|
||||||
&[cre.clone()],
|
|
||||||
&[cre.clone()],
|
|
||||||
);
|
|
||||||
self.0.insert(alice_mem.event_id().clone(), Arc::clone(&alice_mem));
|
|
||||||
|
|
||||||
let join_rules = to_pdu_event(
|
|
||||||
"IJR",
|
|
||||||
alice(),
|
|
||||||
EventType::RoomJoinRules,
|
|
||||||
Some(""),
|
|
||||||
json!({ "join_rule": JoinRule::Public }),
|
|
||||||
&[cre.clone(), alice_mem.event_id().clone()],
|
|
||||||
&[alice_mem.event_id().clone()],
|
|
||||||
);
|
|
||||||
self.0.insert(join_rules.event_id().clone(), join_rules.clone());
|
|
||||||
|
|
||||||
// Bob and Charlie join at the same time, so there is a fork
|
|
||||||
// this will be represented in the state_sets when we resolve
|
|
||||||
let bob_mem = to_pdu_event(
|
|
||||||
"IMB",
|
|
||||||
bob(),
|
|
||||||
EventType::RoomMember,
|
|
||||||
Some(bob().to_string().as_str()),
|
|
||||||
member_content_join(),
|
|
||||||
&[cre.clone(), join_rules.event_id().clone()],
|
|
||||||
&[join_rules.event_id().clone()],
|
|
||||||
);
|
|
||||||
self.0.insert(bob_mem.event_id().clone(), bob_mem.clone());
|
|
||||||
|
|
||||||
let charlie_mem = to_pdu_event(
|
|
||||||
"IMC",
|
|
||||||
charlie(),
|
|
||||||
EventType::RoomMember,
|
|
||||||
Some(charlie().to_string().as_str()),
|
|
||||||
member_content_join(),
|
|
||||||
&[cre, join_rules.event_id().clone()],
|
|
||||||
&[join_rules.event_id().clone()],
|
|
||||||
);
|
|
||||||
self.0.insert(charlie_mem.event_id().clone(), charlie_mem.clone());
|
|
||||||
|
|
||||||
let state_at_bob = [&create_event, &alice_mem, &join_rules, &bob_mem]
|
|
||||||
.iter()
|
|
||||||
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
|
||||||
.collect::<StateMap<_>>();
|
|
||||||
|
|
||||||
let state_at_charlie = [&create_event, &alice_mem, &join_rules, &charlie_mem]
|
|
||||||
.iter()
|
|
||||||
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
|
||||||
.collect::<StateMap<_>>();
|
|
||||||
|
|
||||||
let expected = [&create_event, &alice_mem, &join_rules, &bob_mem, &charlie_mem]
|
|
||||||
.iter()
|
|
||||||
.map(|e| ((e.event_type(), e.state_key()), e.event_id().clone()))
|
|
||||||
.collect::<StateMap<_>>();
|
|
||||||
|
|
||||||
(state_at_bob, state_at_charlie, expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user