Files
WRNexusJS/packages/captcha/test/providers.test.ts
T
2026-07-27 12:42:18 +05:30

55 lines
2.0 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { turnstileProvider } from "../src/providers/turnstile.ts";
import { recaptchaProvider } from "../src/providers/recaptcha.ts";
import { hcaptchaProvider } from "../src/providers/hcaptcha.ts";
const okFetch =
(payload: Record<string, unknown>) =>
async (_url: string | URL | Request, init?: RequestInit) => {
expect(init?.method).toBe("POST");
expect(init?.headers).toMatchObject({ "content-type": "application/x-www-form-urlencoded" });
return Response.json(payload);
};
describe("hosted providers", () => {
test("verifies Turnstile hostname and action", async () => {
const provider = turnstileProvider({
secretKey: "secret",
expectedHostnames: ["example.test"],
expectedAction: "signup",
fetch: okFetch({ success: true, hostname: "example.test", action: "signup" }) as typeof fetch,
});
expect(await provider.verify({ action: "signup", providerToken: "token" })).toMatchObject({
success: true,
provider: "turnstile",
});
});
test("maps provider duplicate failures", async () => {
const provider = recaptchaProvider({
secretKey: "secret",
fetch: okFetch({ success: false, "error-codes": ["timeout-or-duplicate"] }) as typeof fetch,
});
expect(await provider.verify({ action: "login", providerToken: "token" })).toMatchObject({
success: false,
code: "already-used",
});
});
test("sends hCaptcha site key when configured", async () => {
let submitted = "";
const provider = hcaptchaProvider({
secretKey: "secret",
siteKey: "site-key",
fetch: (async (_url, init) => {
submitted = String(init?.body);
return Response.json({ success: true, hostname: "example.test" });
}) as typeof fetch,
});
expect((await provider.verify({ action: "contact", providerToken: "token" })).success).toBe(
true,
);
expect(submitted).toContain("sitekey=site-key");
});
});