use simple_zanzibar::{ZanzibarEngine, error::ZanzibarError, model::Relation};
const TEST_DSL: &str = r#"
// Defines a document namespace with hierarchical permissions.
namespace doc {
relation owner {}
relation parent {}
relation viewer {
rewrite union(
this,
computed_userset(relation: "owner"),
tuple_to_userset(tupleset: "parent", computed_userset: "viewer")
)
}
relation editor {
rewrite intersection(
computed_userset(relation: "owner"),
exclusion(
this,
computed_userset(relation: "viewer")
)
)
}
}
// A simple folder namespace.
namespace folder {
relation viewer {}
}
"#;
#[test]
fn test_parse_full_dsl() -> Result<(), ZanzibarError> {
let service = ZanzibarEngine::builder().build();
service.add_dsl(TEST_DSL)?;
let configs = simple_zanzibar::parser::parse_dsl(TEST_DSL)?;
assert_eq!(configs.len(), 2);
let doc_config = configs
.iter()
.find(|c| c.name == "doc")
.ok_or_else(|| ZanzibarError::ParseError("doc namespace not found".to_string()))?;
assert_eq!(doc_config.relations.len(), 4);
assert!(
doc_config
.relations
.contains_key(&Relation("owner".to_string()))
);
assert!(
doc_config
.relations
.contains_key(&Relation("parent".to_string()))
);
assert!(
doc_config
.relations
.contains_key(&Relation("viewer".to_string()))
);
assert!(
doc_config
.relations
.contains_key(&Relation("editor".to_string()))
);
let viewer_rewrite = doc_config
.relations
.get(&Relation("viewer".to_string()))
.ok_or_else(|| ZanzibarError::ParseError("viewer relation not found".to_string()))?
.userset_rewrite
.as_ref();
assert!(viewer_rewrite.is_some());
let folder_config = configs
.iter()
.find(|c| c.name == "folder")
.ok_or_else(|| ZanzibarError::ParseError("folder namespace not found".to_string()))?;
assert_eq!(folder_config.relations.len(), 1);
assert!(
folder_config
.relations
.contains_key(&Relation("viewer".to_string()))
);
Ok(())
}