← back to Govarbitrage

src/lib/auth.test.ts

42 lines

import { describe, expect, it, beforeAll } from "vitest";
import { hashPassword, verifyPassword } from "./password";
import { createSession, verifySession } from "./session";

beforeAll(() => {
  process.env.AUTH_SECRET = "test-secret-please-change";
});

describe("password hashing (scrypt)", () => {
  it("verifies a correct password and rejects a wrong one", () => {
    const hash = hashPassword("s3cret-pw");
    expect(hash.startsWith("scrypt$")).toBe(true);
    expect(verifyPassword("s3cret-pw", hash)).toBe(true);
    expect(verifyPassword("wrong", hash)).toBe(false);
  });

  it("salts so identical passwords hash differently", () => {
    expect(hashPassword("same")).not.toBe(hashPassword("same"));
  });

  it("rejects malformed stored hashes", () => {
    expect(verifyPassword("x", "$demo$changeme")).toBe(false);
    expect(verifyPassword("x", "garbage")).toBe(false);
  });
});

describe("session JWT", () => {
  it("round-trips a session payload", async () => {
    const token = await createSession({ sub: "u1", email: "a@b.com", role: "ADMIN" });
    const payload = await verifySession(token);
    expect(payload?.sub).toBe("u1");
    expect(payload?.email).toBe("a@b.com");
    expect(payload?.role).toBe("ADMIN");
  });

  it("rejects a tampered/garbage token", async () => {
    expect(await verifySession("not.a.jwt")).toBeNull();
    const token = await createSession({ sub: "u1", email: "a@b.com", role: "ADMIN" });
    expect(await verifySession(token + "x")).toBeNull();
  });
});