89 lines
3.0 KiB
Rust
89 lines
3.0 KiB
Rust
//! Approval text exposes public policy and rejects deceptive display controls.
|
|
use sausage::cred::{
|
|
Caller, Cred,
|
|
edits::{Edit, Operation, OperationRequest},
|
|
items::Item,
|
|
summary::operation_summary,
|
|
};
|
|
#[test]
|
|
fn summaries_show_public_values_rules_free_use_and_wildcard_risk() {
|
|
let item: Item = serde_json::from_value(serde_json::json!({"name":"test","free_use":true,"rules":[{"scheme":"https","hosts":["*.com","api.example"],"port":8443,"path_prefixes":["/"],"methods":null}],"validate_js":null,"transform_js":"","fields":[]})).unwrap();
|
|
let text = operation_summary(&Operation::CreateItem { config: item });
|
|
for part in [
|
|
"without a grant",
|
|
"*.com",
|
|
"api.example",
|
|
"8443",
|
|
"wildcard",
|
|
] {
|
|
assert!(text.contains(part));
|
|
}
|
|
let text = operation_summary(&Operation::SetFieldValue {
|
|
field: "public-id".into(),
|
|
value: "public-value".into(),
|
|
});
|
|
assert!(text.contains("public-id"));
|
|
assert!(text.contains("public-value"));
|
|
}
|
|
#[test]
|
|
fn diffs_report_rule_overlaps_for_edits_and_creation() {
|
|
let dir = tempfile::tempdir().unwrap();
|
|
let c = Cred::open(dir.path()).unwrap();
|
|
let caller = Caller::default();
|
|
let mut item:Item=serde_json::from_value(serde_json::json!({"name":"first","rules":[{"scheme":"https","hosts":["*.example"],"path_prefixes":["/"],"methods":null}],"validate_js":null,"transform_js":"","fields":[]})).unwrap();
|
|
let first = c
|
|
.create_item(item.clone(), &caller, c.unlocked().unwrap())
|
|
.unwrap();
|
|
item.name = "second".into();
|
|
item.rules[0].hosts = vec!["api.example".into()];
|
|
let create = c
|
|
.file_operation_request(
|
|
&caller,
|
|
"create",
|
|
OperationRequest {
|
|
item: None,
|
|
base_version: None,
|
|
change: vec![Operation::CreateItem {
|
|
config: item.clone(),
|
|
}],
|
|
},
|
|
)
|
|
.unwrap();
|
|
assert!(
|
|
c.request_diff(&create).unwrap()["overlapping_items"]
|
|
.as_array()
|
|
.unwrap()
|
|
.iter()
|
|
.any(|v| v == &first.id)
|
|
);
|
|
let second = c.create_item(item, &caller, c.unlocked().unwrap()).unwrap();
|
|
let mut config = second.clone();
|
|
config.name = "edited".into();
|
|
let edit = c
|
|
.file_edit_request(
|
|
&caller,
|
|
"edit",
|
|
Edit {
|
|
item: second.id,
|
|
base_version: second.version,
|
|
config,
|
|
},
|
|
)
|
|
.unwrap();
|
|
assert!(
|
|
c.edit_diff(&edit)
|
|
.unwrap()
|
|
.overlapping_items
|
|
.contains(&first.id)
|
|
);
|
|
}
|
|
#[test]
|
|
fn summaries_remove_bidi_and_zero_width_controls() {
|
|
let text = operation_summary(&Operation::SetName {
|
|
name: "a\u{202e}b\u{2066}c\u{200b}d\u{200d}e\u{feff}".into(),
|
|
});
|
|
for c in ['\u{202e}', '\u{2066}', '\u{200b}', '\u{200d}', '\u{feff}'] {
|
|
assert!(!text.contains(c));
|
|
}
|
|
}
|