Files
cyph3rasi 9e1ed2c9cb Publish the unified MIT-licensed Stuffbox SDK source
Hop-State: A_06FPAF0M83E7T0JJ7EP2WQ0
Hop-Proposal: R_06FPAF04S0D4G8TA8TNK3C0
Hop-Task: T_06FPADTV2YD4PD5GMTK3150
Hop-Attempt: AT_06FPADTV2ZYKEY8GH3JTK98
2026-07-15 03:04:24 -07:00

42 lines
1.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
createPkcePair,
deriveCodeChallenge,
generateCodeVerifier,
generateState,
isValidCodeVerifier,
} from "../src";
describe("PKCE helpers", () => {
it("derives the RFC 7636 S256 example", async () => {
const verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk";
await expect(deriveCodeChallenge(verifier)).resolves.toBe(
"E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM",
);
});
it("generates valid verifier lengths", () => {
for (const length of [43, 64, 128]) {
const verifier = generateCodeVerifier(length);
expect(verifier).toHaveLength(length);
expect(isValidCodeVerifier(verifier)).toBe(true);
}
});
it("rejects invalid verifier lengths and characters", async () => {
expect(() => generateCodeVerifier(42)).toThrow(RangeError);
expect(isValidCodeVerifier("a".repeat(42))).toBe(false);
await expect(deriveCodeChallenge(`${"a".repeat(42)}!`)).rejects.toThrow(
"Invalid RFC 7636 code verifier",
);
});
it("creates an S256 pair and a high-entropy state", async () => {
const pair = await createPkcePair();
expect(pair.method).toBe("S256");
expect(pair.challenge).toBe(await deriveCodeChallenge(pair.verifier));
expect(generateState()).toMatch(/^[A-Za-z0-9_-]{43}$/);
});
});