Path: blob/master/src/packages/database/postgres/manage-users-owner-only.test.ts
5704 views
/*1* This file is part of CoCalc: Copyright © 2025 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import getPool, { initEphemeralDatabase } from "@cocalc/database/pool";6import { db } from "@cocalc/database";7import { uuid } from "@cocalc/util/misc";89let pool: ReturnType<typeof getPool> | undefined;1011beforeAll(async () => {12await initEphemeralDatabase();13pool = getPool();14}, 15000);1516afterAll(async () => {17if (pool) {18await pool.end();19}20});2122async function insertProject(opts: {23projectId: string;24ownerId: string;25collaboratorId: string;26}) {27const { projectId, ownerId, collaboratorId } = opts;28if (!pool) {29throw Error("Pool not initialized");30}31await pool.query("INSERT INTO projects(project_id, users) VALUES ($1, $2)", [32projectId,33{34[ownerId]: { group: "owner" },35[collaboratorId]: { group: "collaborator" },36},37]);38}3940describe("manage_users_owner_only set hook", () => {41const projectId = uuid();42const ownerId = uuid();43const collaboratorId = uuid();4445beforeAll(async () => {46await insertProject({ projectId, ownerId, collaboratorId });47});4849test("owner can set manage_users_owner_only", async () => {50const value = await db()._user_set_query_project_manage_users_owner_only(51{ project_id: projectId, manage_users_owner_only: true },52ownerId,53);54expect(value).toBe(true);55});5657test("collaborator call returns sanitized value (permission enforced elsewhere)", async () => {58const value = await db()._user_set_query_project_manage_users_owner_only(59{ project_id: projectId, manage_users_owner_only: true },60collaboratorId,61);62expect(value).toBe(true);63});6465test("invalid type is rejected", async () => {66expect(() =>67db()._user_set_query_project_manage_users_owner_only(68{ project_id: projectId, manage_users_owner_only: "yes" as any },69ownerId,70),71).toThrow("manage_users_owner_only must be a boolean");72});73});747576