Files
frontend-helper/tests/auth-client.test.ts

36 lines
1.7 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { loadSession, signIn, WRONG_CREDENTIALS } from "@/lib/auth-client";
const json = (body: unknown, status = 200) =>
new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json" } });
describe("signIn", () => {
it("wrong password gives the one message", async () => {
const f = vi.fn(async () => json({ error: "Email or password is incorrect." }, 401));
expect(await signIn("a@b.co", "bad", f as unknown as typeof fetch)).toEqual({ ok: false, message: WRONG_CREDENTIALS });
});
it("success returns the person and posts JSON to /api/session", async () => {
const f = vi.fn(async () => json({ name: "Ann", email: "a@b.co", pictureUrl: null }));
const r = await signIn("a@b.co", "pw", f as unknown as typeof fetch);
expect(r).toEqual({ ok: true, person: { name: "Ann", email: "a@b.co", pictureUrl: null } });
expect(f.mock.calls[0]).toMatchObject(["/api/session", { method: "POST" }]);
});
it("network failure is not the wrong-password message", async () => {
const f = vi.fn(async () => { throw new Error("down"); });
const r = await signIn("a@b.co", "pw", f as unknown as typeof fetch);
expect(r.ok).toBe(false);
if (!r.ok) expect(r.message).not.toBe(WRONG_CREDENTIALS);
});
});
describe("loadSession", () => {
it("401 means signed out", async () => {
const f = vi.fn(async () => json({ error: "sign_in" }, 401));
expect(await loadSession(f as unknown as typeof fetch)).toBeNull();
});
it("200 returns the person", async () => {
const f = vi.fn(async () => json({ name: "Ann", email: "a@b.co", pictureUrl: "u" }));
expect((await loadSession(f as unknown as typeof fetch))?.email).toBe("a@b.co");
});
});