76 lines
2.3 KiB
JavaScript
76 lines
2.3 KiB
JavaScript
const verifyCaptcha = require("../src/middlewares/captcha.middleware");
|
|
|
|
function mockRes() {
|
|
const res = {};
|
|
res.status = jest.fn().mockReturnValue(res);
|
|
res.json = jest.fn().mockReturnValue(res);
|
|
return res;
|
|
}
|
|
|
|
describe("verifyCaptcha", () => {
|
|
const originalFetch = global.fetch;
|
|
|
|
beforeEach(() => {
|
|
process.env.TURNSTILE_SECRET_KEY = "secret-test";
|
|
global.fetch = jest.fn();
|
|
});
|
|
|
|
afterEach(() => {
|
|
process.env.TURNSTILE_SECRET_KEY = "";
|
|
global.fetch = originalFetch;
|
|
});
|
|
|
|
it("laisse passer sans vérifier quand aucune clé n'est configurée", async () => {
|
|
process.env.TURNSTILE_SECRET_KEY = "";
|
|
const next = jest.fn();
|
|
|
|
await verifyCaptcha({ body: {} }, mockRes(), next);
|
|
|
|
expect(next).toHaveBeenCalled();
|
|
expect(global.fetch).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("refuse une requête sans jeton", async () => {
|
|
const res = mockRes();
|
|
const next = jest.fn();
|
|
|
|
await verifyCaptcha({ body: {} }, res, next);
|
|
|
|
expect(res.status).toHaveBeenCalledWith(400);
|
|
expect(next).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("appelle next quand Cloudflare valide le jeton", async () => {
|
|
global.fetch.mockResolvedValue({ json: () => Promise.resolve({ success: true }) });
|
|
const next = jest.fn();
|
|
|
|
await verifyCaptcha({ body: { captchaToken: "jeton" }, ip: "1.2.3.4" }, mockRes(), next);
|
|
|
|
expect(next).toHaveBeenCalled();
|
|
const [, options] = global.fetch.mock.calls[0];
|
|
expect(JSON.parse(options.body)).toEqual({ secret: "secret-test", response: "jeton", remoteip: "1.2.3.4" });
|
|
});
|
|
|
|
it("refuse quand Cloudflare rejette le jeton", async () => {
|
|
global.fetch.mockResolvedValue({ json: () => Promise.resolve({ success: false }) });
|
|
const res = mockRes();
|
|
const next = jest.fn();
|
|
|
|
await verifyCaptcha({ body: { captchaToken: "faux" } }, res, next);
|
|
|
|
expect(res.status).toHaveBeenCalledWith(400);
|
|
expect(next).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("répond 503 quand Cloudflare est injoignable", async () => {
|
|
global.fetch.mockRejectedValue(new Error("réseau"));
|
|
jest.spyOn(console, "error").mockImplementation(() => {});
|
|
const res = mockRes();
|
|
|
|
await verifyCaptcha({ body: { captchaToken: "jeton" } }, res, jest.fn());
|
|
|
|
expect(res.status).toHaveBeenCalledWith(503);
|
|
console.error.mockRestore();
|
|
});
|
|
});
|