homeio
PublikFork dari doctor-io/homeio
partial-auth.test.ts
import { describe, expect, it } from "vitest";
import {
PARTIAL_AUTH_TOKEN_PREFIX,
buildPartialAuthPayload,
isPartialAuthExpired,
parsePartialAuthToken,
} from "@/lib/shared/auth/partial-auth";
describe("shared partial-auth helpers", () => {
it("builds the prefixed payload string", () => {
expect(buildPartialAuthPayload("user-1", 1890000000)).toBe(
`${PARTIAL_AUTH_TOKEN_PREFIX}.user-1.1890000000`,
);
});
it("parses a well-formed token", () => {
const parsed = parsePartialAuthToken(
`${PARTIAL_AUTH_TOKEN_PREFIX}.user-1.1890000000.deadbeef`,
);
expect(parsed).toEqual({
payload: `${PARTIAL_AUTH_TOKEN_PREFIX}.user-1.1890000000`,
userId: "user-1",
expiresAtEpochSeconds: 1890000000,
signature: "deadbeef",
});
});
it("rejects tokens with the wrong prefix segment", () => {
// A session-token-shaped value must NOT parse as a partial-auth token,
// even if it happens to have 4 dot-segments by accident.
expect(parsePartialAuthToken("session-1.1890000000.sig.x")).toBeNull();
});
it("rejects tokens with the wrong segment count", () => {
expect(parsePartialAuthToken("partial.user-1.1890000000")).toBeNull();
expect(
parsePartialAuthToken("partial.user-1.1890000000.sig.extra"),
).toBeNull();
});
it("rejects tokens with non-numeric expiry", () => {
expect(
parsePartialAuthToken("partial.user-1.not-a-number.sig"),
).toBeNull();
});
it("rejects tokens with empty fields", () => {
expect(parsePartialAuthToken("partial..1890000000.sig")).toBeNull();
expect(parsePartialAuthToken("partial.user-1.1890000000.")).toBeNull();
});
it("detects expiration off the current clock", () => {
const nowSeconds = Math.floor(Date.now() / 1000);
expect(isPartialAuthExpired(nowSeconds - 1)).toBe(true);
expect(isPartialAuthExpired(nowSeconds + 60)).toBe(false);
});
});