common: Add tests for push rules
This commit is contained in:
parent
c8c45d10fa
commit
945e085c7a
@ -430,3 +430,499 @@ pub enum PushFormat {
|
||||
#[doc(hidden)]
|
||||
_Custom(String),
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use js_int::uint;
|
||||
use matches::assert_matches;
|
||||
use serde_json::{
|
||||
from_value as from_json_value, json, to_value as to_json_value,
|
||||
value::RawValue as RawJsonValue, Value as JsonValue,
|
||||
};
|
||||
|
||||
use super::{
|
||||
action::{Action, Tweak},
|
||||
condition::{PushCondition, RoomMemberCountIs},
|
||||
AnyPushRule, ConditionalPushRule, PatternedPushRule, Ruleset, SimplePushRule,
|
||||
};
|
||||
|
||||
fn example_ruleset() -> Ruleset {
|
||||
let mut set = Ruleset::new();
|
||||
|
||||
set.add(AnyPushRule::Override(ConditionalPushRule {
|
||||
conditions: vec![PushCondition::EventMatch {
|
||||
key: "type".into(),
|
||||
pattern: "m.call.invite".into(),
|
||||
}],
|
||||
actions: vec![Action::Notify, Action::SetTweak(Tweak::Highlight(true))],
|
||||
rule_id: ".m.rule.call".into(),
|
||||
enabled: true,
|
||||
default: true,
|
||||
}));
|
||||
|
||||
set
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cannot_add_same_rule_id() {
|
||||
let mut set = example_ruleset();
|
||||
|
||||
let added = set.add(AnyPushRule::Override(ConditionalPushRule {
|
||||
conditions: vec![],
|
||||
actions: vec![],
|
||||
rule_id: ".m.rule.call".into(),
|
||||
enabled: true,
|
||||
default: true,
|
||||
}));
|
||||
|
||||
assert!(!added);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_add_same_rule_id_different_kind() {
|
||||
let mut set = example_ruleset();
|
||||
|
||||
let added = set.add(AnyPushRule::Underride(ConditionalPushRule {
|
||||
conditions: vec![],
|
||||
actions: vec![],
|
||||
rule_id: ".m.rule.call".into(),
|
||||
enabled: true,
|
||||
default: true,
|
||||
}));
|
||||
|
||||
assert!(added);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn get_by_rule_id() {
|
||||
let set = example_ruleset();
|
||||
|
||||
let rule = set.override_.get(".m.rule.call");
|
||||
assert!(rule.is_some());
|
||||
assert_eq!(rule.unwrap().rule_id, ".m.rule.call");
|
||||
|
||||
let rule = set.override_.get(".m.rule.doesntexist");
|
||||
assert!(rule.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn iter() {
|
||||
let mut set = example_ruleset();
|
||||
|
||||
let added = set.add(AnyPushRule::Override(ConditionalPushRule {
|
||||
conditions: vec![PushCondition::EventMatch {
|
||||
key: "room_id".into(),
|
||||
pattern: "!roomid:matrix.org".into(),
|
||||
}],
|
||||
actions: vec![Action::DontNotify],
|
||||
rule_id: "!roomid:matrix.org".into(),
|
||||
enabled: true,
|
||||
default: false,
|
||||
}));
|
||||
assert!(added);
|
||||
|
||||
let added = set.add(AnyPushRule::Override(ConditionalPushRule {
|
||||
conditions: vec![],
|
||||
actions: vec![],
|
||||
rule_id: ".m.rule.suppress_notices".into(),
|
||||
enabled: false,
|
||||
default: true,
|
||||
}));
|
||||
assert!(added);
|
||||
|
||||
let mut iter = set.into_iter();
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Override(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == ".m.rule.call"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Override(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == "!roomid:matrix.org"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Override(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == ".m.rule.suppress_notices"
|
||||
);
|
||||
|
||||
assert!(iter.next().is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize_conditional_push_rule() {
|
||||
let rule = ConditionalPushRule {
|
||||
actions: vec![Action::Notify, Action::SetTweak(Tweak::Highlight(true))],
|
||||
default: true,
|
||||
enabled: true,
|
||||
rule_id: ".m.rule.call".into(),
|
||||
conditions: vec![
|
||||
PushCondition::EventMatch { key: "type".into(), pattern: "m.call.invite".into() },
|
||||
PushCondition::ContainsDisplayName,
|
||||
PushCondition::RoomMemberCount { is: RoomMemberCountIs::gt(uint!(2)) },
|
||||
PushCondition::SenderNotificationPermission { key: "room".into() },
|
||||
],
|
||||
};
|
||||
|
||||
let rule_value: JsonValue = to_json_value(rule).unwrap();
|
||||
assert_eq!(
|
||||
rule_value,
|
||||
json!({
|
||||
"conditions": [
|
||||
{
|
||||
"kind": "event_match",
|
||||
"key": "type",
|
||||
"pattern": "m.call.invite"
|
||||
},
|
||||
{
|
||||
"kind": "contains_display_name"
|
||||
},
|
||||
{
|
||||
"kind": "room_member_count",
|
||||
"is": ">2"
|
||||
},
|
||||
{
|
||||
"kind": "sender_notification_permission",
|
||||
"key": "room"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "highlight"
|
||||
}
|
||||
],
|
||||
"rule_id": ".m.rule.call",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize_simple_push_rule() {
|
||||
let rule = SimplePushRule {
|
||||
actions: vec![Action::DontNotify],
|
||||
default: false,
|
||||
enabled: false,
|
||||
rule_id: "!roomid:server.name".into(),
|
||||
};
|
||||
|
||||
let rule_value: JsonValue = to_json_value(rule).unwrap();
|
||||
assert_eq!(
|
||||
rule_value,
|
||||
json!({
|
||||
"actions": [
|
||||
"dont_notify"
|
||||
],
|
||||
"rule_id": "!roomid:server.name",
|
||||
"default": false,
|
||||
"enabled": false
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize_patterned_push_rule() {
|
||||
let rule = PatternedPushRule {
|
||||
actions: vec![
|
||||
Action::Notify,
|
||||
Action::SetTweak(Tweak::Sound("default".into())),
|
||||
Action::SetTweak(Tweak::Custom {
|
||||
name: "dance".into(),
|
||||
value: RawJsonValue::from_string("true".into()).unwrap(),
|
||||
}),
|
||||
],
|
||||
default: true,
|
||||
enabled: true,
|
||||
pattern: "user_id".into(),
|
||||
rule_id: ".m.rule.contains_user_name".into(),
|
||||
};
|
||||
|
||||
let rule_value: JsonValue = to_json_value(rule).unwrap();
|
||||
assert_eq!(
|
||||
rule_value,
|
||||
json!({
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "sound",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"set_tweak": "dance",
|
||||
"value": true
|
||||
}
|
||||
],
|
||||
"pattern": "user_id",
|
||||
"rule_id": ".m.rule.contains_user_name",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serialize_ruleset() {
|
||||
let mut set = example_ruleset();
|
||||
|
||||
set.add(AnyPushRule::Override(ConditionalPushRule {
|
||||
conditions: vec![
|
||||
PushCondition::RoomMemberCount { is: RoomMemberCountIs::from(uint!(2)) },
|
||||
PushCondition::EventMatch { key: "type".into(), pattern: "m.room.message".into() },
|
||||
],
|
||||
actions: vec![
|
||||
Action::Notify,
|
||||
Action::SetTweak(Tweak::Sound("default".into())),
|
||||
Action::SetTweak(Tweak::Highlight(false)),
|
||||
],
|
||||
rule_id: ".m.rule.room_one_to_one".into(),
|
||||
enabled: true,
|
||||
default: true,
|
||||
}));
|
||||
set.add(AnyPushRule::Content(PatternedPushRule {
|
||||
actions: vec![
|
||||
Action::Notify,
|
||||
Action::SetTweak(Tweak::Sound("default".into())),
|
||||
Action::SetTweak(Tweak::Highlight(true)),
|
||||
],
|
||||
rule_id: ".m.rule.contains_user_name".into(),
|
||||
pattern: "user_id".into(),
|
||||
enabled: true,
|
||||
default: true,
|
||||
}));
|
||||
|
||||
let set_value: JsonValue = to_json_value(set).unwrap();
|
||||
assert_eq!(
|
||||
set_value,
|
||||
json!({
|
||||
"override": [
|
||||
{
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "highlight",
|
||||
},
|
||||
],
|
||||
"conditions": [
|
||||
{
|
||||
"kind": "event_match",
|
||||
"key": "type",
|
||||
"pattern": "m.call.invite"
|
||||
},
|
||||
],
|
||||
"rule_id": ".m.rule.call",
|
||||
"default": true,
|
||||
"enabled": true,
|
||||
},
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"kind": "room_member_count",
|
||||
"is": "2"
|
||||
},
|
||||
{
|
||||
"kind": "event_match",
|
||||
"key": "type",
|
||||
"pattern": "m.room.message"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "sound",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"set_tweak": "highlight",
|
||||
"value": false
|
||||
}
|
||||
],
|
||||
"rule_id": ".m.rule.room_one_to_one",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
},
|
||||
],
|
||||
"room": [],
|
||||
"content": [
|
||||
{
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "sound",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"set_tweak": "highlight"
|
||||
}
|
||||
],
|
||||
"pattern": "user_id",
|
||||
"rule_id": ".m.rule.contains_user_name",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
}
|
||||
],
|
||||
"sender": [],
|
||||
"underride": [],
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deserialize_patterned_push_rule() {
|
||||
let rule = from_json_value(json!({
|
||||
"actions": [
|
||||
"notify",
|
||||
{
|
||||
"set_tweak": "sound",
|
||||
"value": "default"
|
||||
},
|
||||
{
|
||||
"set_tweak": "highlight",
|
||||
"value": true
|
||||
}
|
||||
],
|
||||
"pattern": "user_id",
|
||||
"rule_id": ".m.rule.contains_user_name",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
}))
|
||||
.unwrap();
|
||||
assert_matches!(
|
||||
rule,
|
||||
PatternedPushRule {
|
||||
actions: _,
|
||||
default: true,
|
||||
enabled: true,
|
||||
pattern,
|
||||
rule_id,
|
||||
}
|
||||
if pattern == "user_id" && rule_id == ".m.rule.contains_user_name"
|
||||
);
|
||||
|
||||
let mut iter = rule.actions.iter();
|
||||
assert_matches!(iter.next(), Some(Action::Notify));
|
||||
assert_matches!(iter.next(), Some(Action::SetTweak(Tweak::Sound(sound))) if sound == "default");
|
||||
assert_matches!(iter.next(), Some(Action::SetTweak(Tweak::Highlight(true))));
|
||||
assert_matches!(iter.next(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deserialize_ruleset() {
|
||||
let set: Ruleset = from_json_value(json!({
|
||||
"override": [
|
||||
{
|
||||
"actions": [],
|
||||
"conditions": [],
|
||||
"rule_id": "!roomid:server.name",
|
||||
"default": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"actions": [],
|
||||
"conditions": [],
|
||||
"rule_id": ".m.rule.call",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
},
|
||||
],
|
||||
"underride": [
|
||||
{
|
||||
"actions": [],
|
||||
"conditions": [],
|
||||
"rule_id": ".m.rule.room_one_to_one",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
},
|
||||
],
|
||||
"room": [
|
||||
{
|
||||
"actions": [],
|
||||
"rule_id": "!roomid:server.name",
|
||||
"default": false,
|
||||
"enabled": false
|
||||
}
|
||||
],
|
||||
"sender": [],
|
||||
"content": [
|
||||
{
|
||||
"actions": [],
|
||||
"pattern": "user_id",
|
||||
"rule_id": ".m.rule.contains_user_name",
|
||||
"default": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"actions": [],
|
||||
"pattern": "ruma",
|
||||
"rule_id": "ruma",
|
||||
"default": false,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}))
|
||||
.unwrap();
|
||||
|
||||
let mut iter = set.into_iter();
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Override(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == "!roomid:server.name"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Override(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == ".m.rule.call"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Content(PatternedPushRule { rule_id, .. })
|
||||
if rule_id == ".m.rule.contains_user_name"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Content(PatternedPushRule { rule_id, .. })
|
||||
if rule_id == "ruma"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Room(SimplePushRule { rule_id, .. })
|
||||
if rule_id == "!roomid:server.name"
|
||||
);
|
||||
|
||||
let rule_opt = iter.next();
|
||||
assert!(rule_opt.is_some());
|
||||
assert_matches!(
|
||||
rule_opt.unwrap(),
|
||||
AnyPushRule::Underride(ConditionalPushRule { rule_id, .. })
|
||||
if rule_id == ".m.rule.room_one_to_one"
|
||||
);
|
||||
|
||||
assert!(iter.next().is_none());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user