import { describe, expect, it } from "vitest";
import {
parseAuthIdentity,
type AuthIdentity,
type AuthTokenIdentity,
} from "@/lib/auth/types";
const completeIdentity: AuthIdentity = {
id: "00000000-0000-4000-8000-000000000042",
externalUserId: "42",
login: "alice",
fullName: "Alice Smith",
position: "Engineer",
email: "alice@example.com",
firstName: "Alice",
lastName: "Smith",
middleName: "Jane",
roles: ["admin", "employee"],
lastModelId: "chatgpt",
};
// AuthIdentity is the complete, projected identity returned after external authentication.
// @ts-expect-error A missing role must not satisfy the complete identity contract.
const incompleteIdentity: AuthIdentity = {
id: "00000000-0000-4000-8000-000000000042",
externalUserId: "42",
login: "alice",
fullName: "Alice Smith",
position: "Engineer",
email: "alice@example.com",
firstName: "Alice",
lastName: "Smith",
middleName: "Jane",
lastModelId: "chatgpt",
};
const gateTokenIdentity: AuthTokenIdentity = {
id: completeIdentity.id,
email: completeIdentity.email,
externalUserId: completeIdentity.externalUserId,
tenantId: "tenant-1",
};
describe("authentication identity", () => {
it("keeps the complete external profile available to consumers", () => {
expect(completeIdentity.roles).toEqual(["admin", "employee"]);
expect(incompleteIdentity).toBeDefined();
expect(gateTokenIdentity).toEqual({
id: completeIdentity.id,
email: completeIdentity.email,
externalUserId: "42",
tenantId: "tenant-1",
});
});
it("parses the complete browser identity with a decimal external ID", () => {
expect(parseAuthIdentity(completeIdentity)).toEqual(completeIdentity);
});
it("accepts a browser identity with a dynamic Gate model", () => {
expect(
parseAuthIdentity({ ...completeIdentity, lastModelId: "claude-sonnet.4" }),
).toMatchObject({ lastModelId: "claude-sonnet.4" });
});
it.each(["GPT-4", "model/path", ".leading", "", null])(
"rejects an identity with an invalid lastModelId %j",
(lastModelId) => {
expect(parseAuthIdentity({ ...completeIdentity, lastModelId })).toBeNull();
},
);
it.each([42, "0", "01", "9223372036854775808"])(
"rejects an unsafe external ID representation %j",
(externalUserId) => {
expect(parseAuthIdentity({ ...completeIdentity, externalUserId })).toBeNull();
},
);
});