@clickup/ent-framework
Version:
A PostgreSQL graph-database-alike library with microsharding and row-level security
113 lines (101 loc) • 2.99 kB
text/typescript
import { recreateTestTables, testCluster } from "../../pg/__tests__/test-utils";
import { PgSchema } from "../../pg/PgSchema";
import { ID } from "../../types";
import { BaseEnt } from "../BaseEnt";
import { CanReadOutgoingEdge } from "../predicates/CanReadOutgoingEdge";
import { OutgoingEdgePointsToVC } from "../predicates/OutgoingEdgePointsToVC";
import { True } from "../predicates/True";
import { AllowIf } from "../rules/AllowIf";
import { Require } from "../rules/Require";
import { GLOBAL_SHARD } from "../ShardAffinity";
import { createVC } from "./test-utils";
class EntTestUser extends BaseEnt(
testCluster,
new PgSchema(
'ent.composite-pk"user',
{
userid: { type: ID, autoInsert: "id_gen()" },
name: { type: String },
},
["userid"],
),
) {
static readonly CREATE = [
`CREATE TABLE %T(
userid bigint NOT NULL PRIMARY KEY,
name text
)`,
];
static override configure() {
return new this.Configuration({
shardAffinity: GLOBAL_SHARD,
privacyInferPrincipal: async (_vc, row) => row.userid,
privacyLoad: [new AllowIf(new OutgoingEdgePointsToVC("userid"))],
privacyInsert: [],
privacyUpdate: [new Require(new OutgoingEdgePointsToVC("userid"))],
});
}
}
class EntTestComposite extends BaseEnt(
testCluster,
new PgSchema(
'ent.composite-pk"composite',
{
user_id: { type: ID },
some_id: { type: ID, autoInsert: "id_gen()" },
name: { type: String },
},
["user_id", "some_id"],
),
) {
static readonly CREATE = [
`CREATE TABLE %T(
user_id bigint NOT NULL,
some_id bigint NOT NULL,
name text,
PRIMARY KEY (user_id, some_id)
)`,
];
static override configure() {
return new this.Configuration({
shardAffinity: ["some_id"],
privacyInferPrincipal: async (_vc, row) => row.user_id,
privacyLoad: [
new AllowIf(new CanReadOutgoingEdge("user_id", EntTestUser)),
],
privacyInsert: [new Require(new True())],
});
}
}
let user: EntTestUser;
beforeEach(async () => {
await recreateTestTables([EntTestUser, EntTestComposite]);
user = await EntTestUser.insertReturning(createVC().toOmniDangerous(), {
name: "my-name",
});
expect(user).toMatchObject({
id: user.vc.principal,
userid: user.vc.principal,
});
});
test("simple use case", async () => {
const composite = await EntTestComposite.insertReturning(user.vc, {
user_id: user.vc.principal,
name: "my-name",
});
expect(composite).toMatchObject({
id: `(${user.vc.principal},${composite.some_id})`,
user_id: user.vc.principal,
});
const rows = await EntTestComposite.select(
user.vc,
{ user_id: composite.user_id, some_id: composite.some_id },
1,
);
expect(rows).toHaveLength(1);
await EntTestComposite.loadByX(user.vc, {
user_id: composite.user_id,
some_id: composite.some_id,
});
await EntTestComposite.loadX(user.vc, composite.id);
});