//! 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)); } }