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(); }); });