import { describe, expect, it } from "@effect/vitest"; import type { CloudflareConfig } from "../config"; import { principalFromAccessClaims } from "./cloudflare-access"; const config: CloudflareConfig = { accessTeamDomain: "team.cloudflareaccess.com", accessAud: "aud-tag", accessNameClaim: "name", accessGroupsClaim: "groups", adminEmails: ["admin@example.com"], organizationId: "default", organizationName: "Default", organizationSlug: "default", secretKey: "x".repeat(32), allowLocalNetwork: false, webBaseUrl: "https://localhost", enableDevAuth: false, }; describe("principalFromAccessClaims", () => { it("maps a human identity (email + sub + groups)", () => { const p = principalFromAccessClaims( { sub: "user-123", email: "person@example.com", name: "Person", groups: ["eng"] }, config, ); expect(p.accountId).toBe("user-123"); expect(p.email).toBe("person@example.com"); expect(p.name).toBe("Person"); expect(p.roles).toEqual(["eng"]); expect(p.organizationId).toBe("default"); }); it("grants admin when the email is in the allowlist", () => { const p = principalFromAccessClaims({ sub: "u", email: "ADMIN@example.com" }, config); expect(p.roles).toContain("admin"); }); it("gives a SERVICE TOKEN (common_name, no email/sub) a stable identity", () => { // Cloudflare Access service-token JWT: common_name set, email/sub absent. const p = principalFromAccessClaims({ common_name: "df8a20db.access", type: "app" }, config); expect(p.accountId).toBe("df8a20db.access"); // not empty — stable per token expect(p.name).toBe("df8a20db.access"); expect(p.email).toBe(""); expect(p.roles).toEqual(["member"]); // a token is a member, not an admin expect(p.organizationId).toBe("default"); }); it("defaults to member when there are no groups and no admin match", () => { const p = principalFromAccessClaims({ sub: "u", email: "nobody@other.com" }, config); expect(p.roles).toEqual(["member"]); }); });