cratestack-parser 0.3.7

Rust-native schema-first framework for typed HTTP APIs, generated clients, and backend services.
Documentation
#![cfg(test)]

use super::parse_schema;

#[test]
fn preserves_recursive_relation_policy_attributes() {
    let schema = parse_schema(
        r#"
auth SessionUser {
  email String
  orgSlug String
}

model Organization {
  id Int @id
  slug String
}

model User {
  id Int @id
  email String
  banned Boolean
}

model Project {
  id Int @id
  organizationId Int
  organization Organization @relation(fields:[organizationId],references:[id])
  memberships Membership[] @relation(fields:[id],references:[projectId])
}

model Membership {
  id Int @id
  projectId Int
  userId Int
  active Boolean
  blocked Boolean
  project Project @relation(fields:[projectId],references:[id])
  user User @relation(fields:[userId],references:[id])
}

model Task {
  id Int @id
  projectId Int
  project Project @relation(fields:[projectId],references:[id])

  @@deny("read", project.memberships.some.user.banned)
  @@allow("read", project.organization.slug == auth().orgSlug && project.memberships.some.user.email == auth().email)
  @@allow("delete", project.memberships.every.active)
  @@allow("create", project.memberships.none.blocked)
}
"#,
    )
    .expect("recursive policy schema should parse");

    let task = schema
        .models
        .iter()
        .find(|model| model.name == "Task")
        .expect("task model should parse");
    assert_eq!(task.attributes.len(), 4);
    assert!(
        task.attributes[0]
            .raw
            .contains("project.memberships.some.user.banned")
    );
    assert!(
        task.attributes[1]
            .raw
            .contains("project.organization.slug == auth().orgSlug")
    );
    assert!(
        task.attributes[2]
            .raw
            .contains("project.memberships.every.active")
    );
    assert!(
        task.attributes[3]
            .raw
            .contains("project.memberships.none.blocked")
    );
}