53 lines · 2.0 KB · TypeScript
RawDownload
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"]);  });});