graplix
Version:
Authorization framework for implementing Relation-based Access Control (ReBAC) with the Resolver (Inspired by [GraphQL](https://graphql.org))
228 lines (171 loc) • 5.6 kB
text/typescript
import { transformer } from "@openfga/syntax-transformer";
import { MultipleUnimplementedError } from "./MultipleError";
import { validate } from "./validate";
function transformDSLToJSONObject([data]: TemplateStringsArray) {
return transformer.transformDSLToJSONObject(data);
}
describe("validate", () => {
test("it should not throw an error when only type is defined", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
`;
expect(() => validate(model)).not.toThrow();
});
test("it should not throw an error when relation is defined with only directly related user types", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
`;
expect(() => validate(model)).not.toThrow();
});
test("it should throw MultipleUnimplementedError when multiple directly related user types are defined", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
type organization
relations
define viewer: [user, team]
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should not throw an error when relation is defined with computed set", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
define admin: member
`;
expect(() => validate(model)).not.toThrow();
});
test("it should not throw an error when operator 'or' is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type channel
relations
define follower: [user]
define owner: [user]
define can_view: follower or owner
`;
expect(() => validate(model)).not.toThrow();
});
test("it should throw an error when operator 'or' is used between directly related user types and computed set", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
define admin: [user] or member
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should throw an error when operator 'and' is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type channel
relations
define editor: [user]
define reviewer: [user]
define publisher: editor and reviewer
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should throw an error when operator 'but not' is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type channel
relations
define editor: [user]
define reviewer: [user]
define publisher: editor but not reviewer
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should not throw an error when relation is defined with tuple to userset", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type team
relations
define parent: [organization]
define admin: member from parent
type organization
relations
define member: [user]
`;
expect(() => validate(model)).not.toThrow();
});
test("it should throw an error when type restriction relation is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
type organization
relations
define viewer: [team#member]
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should throw an error when type restriction wildcard is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: [user]
type organization
relations
define viewer: [team:*]
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should throw an error when condition is defined", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type document
relations
define viewer: [user with conditionX]
condition conditionX(x: string) {
x=="{}"
}
`;
expect(() => validate(model)).toThrow(MultipleUnimplementedError);
});
test("it should not throw an error when parenthesized relation is used in relation definition", () => {
const model = transformDSLToJSONObject`
model
schema 1.1
type user
type team
relations
define member: ([user] or allowed) or blocked
`;
expect(() => validate(model)).not.toThrow(MultipleUnimplementedError);
});
});