#![cfg(test)]
use crate::{PolicyExpr, PolicyLiteral, ReadPolicy, ReadPredicate, render::render_read_policy_sql};
use cratestack_core::{CoolContext, Value};
fn render(allow: &[ReadPolicy], deny: &[ReadPolicy], ctx: &CoolContext) -> Option<String> {
let mut bind_index = 1usize;
render_read_policy_sql(allow, deny, ctx, &mut bind_index)
}
#[test]
fn field_is_true_and_field_ne_literal_render_column_comparisons() {
let ctx = CoolContext::anonymous();
let allow_is_true = [ReadPolicy {
expr: PolicyExpr::Predicate(ReadPredicate::FieldIsTrue {
column: "published",
}),
}];
assert_eq!(
render(&allow_is_true, &[], &ctx).unwrap(),
"published = TRUE"
);
let allow_ne = [ReadPolicy {
expr: PolicyExpr::Predicate(ReadPredicate::FieldNeLiteral {
column: "status",
value: PolicyLiteral::String("archived"),
}),
}];
assert_eq!(render(&allow_ne, &[], &ctx).unwrap(), "status != $1");
}
#[test]
fn field_ne_auth_renders_bound_column_comparison() {
let ctx = CoolContext::authenticated([(
"email".to_owned(),
Value::String("owner@example.com".to_owned()),
)]);
let allow = [ReadPolicy {
expr: PolicyExpr::Predicate(ReadPredicate::FieldNeAuth {
column: "email",
auth_field: "email",
}),
}];
assert_eq!(render(&allow, &[], &ctx).unwrap(), "email != $1");
}
#[test]
fn every_relation_quantifier_variant_renders_its_own_sql_shape() {
let ctx = CoolContext::anonymous();
let policy_for = |quantifier: crate::RelationQuantifier| {
[ReadPolicy {
expr: PolicyExpr::Predicate(ReadPredicate::Relation {
quantifier,
parent_table: "users",
parent_column: "id",
related_table: "sessions",
related_column: "user_id",
expr: &PolicyExpr::Predicate(ReadPredicate::FieldIsTrue { column: "active" }),
}),
}]
};
assert_eq!(
render(&policy_for(crate::RelationQuantifier::ToOne), &[], &ctx).unwrap(),
"EXISTS (SELECT 1 FROM sessions WHERE sessions.user_id = users.id AND active = TRUE)"
);
assert_eq!(
render(&policy_for(crate::RelationQuantifier::Some), &[], &ctx).unwrap(),
"EXISTS (SELECT 1 FROM sessions WHERE sessions.user_id = users.id AND active = TRUE)"
);
assert_eq!(
render(&policy_for(crate::RelationQuantifier::None), &[], &ctx).unwrap(),
"NOT EXISTS (SELECT 1 FROM sessions WHERE sessions.user_id = users.id AND active = TRUE)"
);
assert_eq!(
render(&policy_for(crate::RelationQuantifier::Every), &[], &ctx).unwrap(),
"NOT EXISTS (SELECT 1 FROM sessions WHERE sessions.user_id = users.id AND NOT (active = TRUE))"
);
}