use super::common::make_workspace_with_headers_and_body;
use crate::{
view::{ConfigFileKind, EditCommand, NodeKind},
workspace::Workspace,
};
#[test]
fn add_header_condition_creates_condition() {
let (dir, root) = make_workspace_with_headers_and_body();
let mut ws = Workspace::load(root).expect("load");
let snap = ws.snapshot();
let rule_id = snap
.files
.iter()
.find(|f| matches!(f.kind, ConfigFileKind::RuleSet))
.unwrap()
.nodes
.iter()
.find(|n| matches!(n.kind, NodeKind::Rule))
.unwrap()
.id;
let result = ws
.apply(EditCommand::AddHeaderCondition {
rule_id,
condition: crate::view::HeaderConditionPayload {
name: "x-new-header".to_owned(),
op: crate::view::HeaderOp::Equal,
value: Some("new-value".to_owned()),
},
})
.expect("add ok");
assert!(
!result.changed_nodes.is_empty(),
"should return changed node ids"
);
let rule = &ws.config().service.rule_sets[0].rules[0];
assert!(rule.when.request.headers.is_some());
let headers = rule.when.request.headers.as_ref().unwrap();
assert!(
headers.0.contains_key("x-new-header"),
"header should be present"
);
let _ = dir;
}
#[test]
fn remove_header_condition_deletes_it() {
let (_dir, root) = make_workspace_with_headers_and_body();
let mut ws = Workspace::load(root).expect("load");
let snap = ws.snapshot();
let rule_id = snap
.files
.iter()
.find(|f| matches!(f.kind, ConfigFileKind::RuleSet))
.unwrap()
.nodes
.iter()
.find(|n| matches!(n.kind, NodeKind::Rule))
.unwrap()
.id;
let add_result = ws
.apply(EditCommand::AddHeaderCondition {
rule_id,
condition: crate::view::HeaderConditionPayload {
name: "x-remove-me".to_owned(),
op: crate::view::HeaderOp::Equal,
value: Some("gone".to_owned()),
},
})
.expect("add");
let cond_id = add_result
.changed_nodes
.iter()
.copied()
.find(|id| *id != rule_id)
.expect("cond id");
ws.apply(EditCommand::RemoveHeaderCondition { id: cond_id })
.expect("remove");
let rule = &ws.config().service.rule_sets[0].rules[0];
let absent = rule
.when
.request
.headers
.as_ref()
.map(|h| !h.0.contains_key("x-remove-me"))
.unwrap_or(true);
assert!(absent, "header should be removed");
}
#[test]
fn add_body_condition_creates_condition() {
let (_dir, root) = make_workspace_with_headers_and_body();
let mut ws = Workspace::load(root).expect("load");
let snap = ws.snapshot();
let rule_id = snap
.files
.iter()
.find(|f| matches!(f.kind, ConfigFileKind::RuleSet))
.unwrap()
.nodes
.iter()
.find(|n| matches!(n.kind, NodeKind::Rule))
.unwrap()
.id;
ws.apply(EditCommand::AddBodyCondition {
rule_id,
condition: crate::view::BodyConditionPayload {
kind: crate::view::BodyConditionKind::Json,
path: "user.role".to_owned(),
op: crate::view::BodyOp::Equal,
value: serde_json::Value::String("admin".to_owned()),
},
})
.expect("add body condition");
let rule = &ws.config().service.rule_sets[0].rules[0];
assert!(
rule.when.request.body.is_some(),
"body conditions should exist"
);
}
#[test]
fn remove_body_condition_deletes_it() {
let (_dir, root) = make_workspace_with_headers_and_body();
let mut ws = Workspace::load(root).expect("load");
let snap = ws.snapshot();
let rule_id = snap
.files
.iter()
.find(|f| matches!(f.kind, ConfigFileKind::RuleSet))
.unwrap()
.nodes
.iter()
.find(|n| matches!(n.kind, NodeKind::Rule))
.unwrap()
.id;
let add_result = ws
.apply(EditCommand::AddBodyCondition {
rule_id,
condition: crate::view::BodyConditionPayload {
kind: crate::view::BodyConditionKind::Json,
path: "temp.field".to_owned(),
op: crate::view::BodyOp::Equal,
value: serde_json::Value::String("x".to_owned()),
},
})
.expect("add");
let cond_id = add_result
.changed_nodes
.iter()
.copied()
.find(|id| *id != rule_id)
.expect("cond id");
ws.apply(EditCommand::RemoveBodyCondition { id: cond_id })
.expect("remove");
}