Files
Jyotisha/frontend/tests/database-admin-identity.test.ts
Jesse_Chen 8eed0603f9
Staging Backend Quality Gate / validate (push) Successful in 12m30s
Staging Backend Quality Gate / publish (push) Successful in 7m37s
fix(admin): allow administrator list reads
2026-08-11 00:10:24 +08:00

140 lines
5.4 KiB
TypeScript

import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import test from "node:test";
import {
closeLocalPostgresDataPools,
createLocalPostgresDataClient,
type LocalPostgresDataClient,
} from "../src/lib/db/local-postgres-client-core.ts";
import { createAdminSupabaseClient } from "../src/lib/supabase/admin-client-core.ts";
import { startPostgresFixture } from "./helpers/postgres-fixture.ts";
const runnerPath = fileURLToPath(new URL("../scripts/db-migrate.mjs", import.meta.url));
const compatibilitySql = readFileSync(
new URL("../../deploy/postgres/002-ensure-business-compatibility-roles.sql", import.meta.url),
"utf8",
);
const unknownUserId = "00000000-0000-4000-8000-000000000001";
const visibleAdminId = "00000000-0000-4000-8000-000000000002";
test("service and restricted admin database identities stay separated", async () => {
const fixture = startPostgresFixture();
try {
const migration = spawnSync(process.execPath, [runnerPath], {
encoding: "utf8",
env: {
...process.env,
SCHEMA_DATABASE_URL: fixture.connectionUrl("schema_owner", "schema-owner-test-password"),
},
});
assert.equal(migration.status, 0, `${migration.stdout}${migration.stderr}`);
fixture.psql(
"revoke connect on database jyotisha from public, service_runtime; "
+ "revoke service_role from service_runtime; grant service_role to admin_runtime",
);
const compatibility = spawnSync(
"docker",
[
"compose",
"--project-name",
fixture.projectName,
"--env-file",
fixture.databaseEnvFile,
"-f",
"../deploy/docker-compose.postgres.yml",
"-f",
"../deploy/docker-compose.postgres-ci.yml",
"exec",
"-T",
"postgres",
"psql",
"-v",
"ON_ERROR_STOP=1",
"-U",
"postgres",
"-d",
"jyotisha",
"-f",
"/dev/stdin",
],
{
encoding: "utf8",
input: compatibilitySql,
env: {
...process.env,
DATABASE_ENV_FILE: fixture.databaseEnvFile,
POSTGRES_HOST_PORT: String(fixture.hostPort),
},
},
);
assert.equal(compatibility.status, 0, `${compatibility.stdout}${compatibility.stderr}`);
assert.equal(fixture.psql("select pg_has_role('service_runtime','service_role','MEMBER')"), "t");
assert.equal(fixture.psql("select pg_has_role('admin_runtime','service_role','MEMBER')"), "f");
fixture.psqlAs("identity_runtime", "identity-runtime-test-password", `
insert into identity.users (id, name, email, email_verified, email_verified_at, role)
values ('${visibleAdminId}', 'Visible Admin', 'visible-admin@example.com', true, now(), 'admin')
`);
fixture.psql(`
insert into public.admin_users (user_id, created_by)
values ('${visibleAdminId}', '${visibleAdminId}');
insert into public.admin_user_roles (admin_user_id, role_id, assigned_by)
select '${visibleAdminId}', id, '${visibleAdminId}' from public.admin_roles where code = 'support';
`);
assert.equal(
fixture.psqlAs(
"admin_runtime",
"admin-runtime-test-password",
`select count(*) from public.admin_users where user_id = '${visibleAdminId}' and revoked_at is null`,
),
"1",
"admin list reads must not be hidden by admin_users RLS",
);
const previousAuthProvider = process.env.AUTH_PROVIDER;
const previousServiceDatabaseUrl = process.env.SERVICE_DATABASE_URL;
const previousAdminDatabaseUrl = process.env.ADMIN_DATABASE_URL;
process.env.AUTH_PROVIDER = "self-hosted";
process.env.SERVICE_DATABASE_URL = fixture.connectionUrl("service_runtime", "service-runtime-test-password");
process.env.ADMIN_DATABASE_URL = fixture.connectionUrl("admin_runtime", "admin-runtime-test-password");
try {
const service = createAdminSupabaseClient() as unknown as LocalPostgresDataClient;
const serviceProbe = await service.from("profiles").select("id").limit(1);
assert.equal(serviceProbe.error, null);
} finally {
if (previousAuthProvider === undefined) delete process.env.AUTH_PROVIDER;
else process.env.AUTH_PROVIDER = previousAuthProvider;
if (previousServiceDatabaseUrl === undefined) delete process.env.SERVICE_DATABASE_URL;
else process.env.SERVICE_DATABASE_URL = previousServiceDatabaseUrl;
if (previousAdminDatabaseUrl === undefined) delete process.env.ADMIN_DATABASE_URL;
else process.env.ADMIN_DATABASE_URL = previousAdminDatabaseUrl;
}
const restrictedAdmin = createLocalPostgresDataClient(
fixture.connectionUrl("admin_runtime", "admin-runtime-test-password"),
null,
null,
);
const permissionProbe = await restrictedAdmin.rpc("admin_permission_keys", {
p_user_id: unknownUserId,
});
assert.equal(permissionProbe.error, null);
assert.deepEqual(permissionProbe.data, []);
const elevationProbe = await createLocalPostgresDataClient(
fixture.connectionUrl("admin_runtime", "admin-runtime-test-password"),
null,
"service_role",
).rpc("admin_permission_keys", { p_user_id: unknownUserId });
assert.equal(elevationProbe.error?.code, "42501");
assert.match(elevationProbe.error?.message ?? "", /permission denied to set role/);
} finally {
await closeLocalPostgresDataPools();
fixture.stop();
}
});