Files
Jyotisha/frontend/tests/admin-auth.test.ts
T
Jesse_Chen 9d8c73561f
Staging Backend Quality Gate / validate (push) Failing after 7m30s
Staging Backend Quality Gate / publish (push) Has been skipped
test(deploy): integrate billing admin rollout checks
2026-08-06 20:15:50 +08:00

67 lines
2.0 KiB
TypeScript

import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import test from "node:test";
import { authorizeAdminAccess } from "../src/lib/admin/auth-policy.ts";
import type { IdentityUser } from "../src/modules/identity/contracts.ts";
const adminAuthSource = readFileSync(
new URL("../src/lib/admin/auth.ts", import.meta.url),
"utf8",
);
function user(): IdentityUser {
return {
id: "11111111-1111-4111-8111-111111111111",
email: "admin@example.com",
emailVerified: true,
twoFactorEnabled: false,
name: "Admin",
image: null,
role: ["user"],
};
}
test("anonymous admin access is 401", () => {
assert.deepEqual(authorizeAdminAccess(null, [], "admin.access"), {
allowed: false,
status: 401,
});
});
test("missing permission is 403", () => {
assert.deepEqual(authorizeAdminAccess(user(), [], "admin.access"), {
allowed: false,
status: 403,
});
assert.deepEqual(authorizeAdminAccess(user(), ["admin.access"], "models.publish"), {
allowed: false,
status: 403,
});
});
test("database permission keys authorize only the requested operation", () => {
assert.deepEqual(authorizeAdminAccess(user(), ["admin.access"], "admin.access"), {
allowed: true,
});
assert.deepEqual(authorizeAdminAccess(user(), ["models.read", "models.publish"], "models.publish"), {
allowed: true,
});
});
test("admin session guard requires the configured admin Host before session lookup", () => {
const guard = adminAuthSource.slice(
adminAuthSource.indexOf("export async function requirePermission"),
adminAuthSource.indexOf("export function requireAdminSession"),
);
assert.match(guard, /readSelfHostedIdentityConfig\(process\.env\)/);
assert.match(guard, /resolveIdentitySurface\(adminHeaders\.get\("host"\), identityConfig\) !== "admin"/);
assert.ok(
guard.indexOf("resolveIdentitySurface") < guard.indexOf("requireIdentityServerSession"),
"Host must be rejected before Better Auth session lookup",
);
assert.doesNotMatch(guard, /x-forwarded-host|forwarded/i);
});