spb/phi-conseil
Public
1import { describe, expect, it } from "vitest";2import { contactSchema, cleanText } from "@/lib/validation";34const valid = {5 name: " Marie Tremblay ",6 email: "Marie@Exemple.COM",7 organization: "",8 subject: "Recherche de subventions",9 message: "Bonjour, nous aimerions discuter d'un projet de financement pour notre organisme.",10 consent: true,11 website: "",12};1314describe("validation du formulaire de contact", () => {15 it("normalise et accepte une soumission valide", () => {16 const r = contactSchema.safeParse(valid);17 expect(r.success).toBe(true);18 if (r.success) {19 expect(r.data.name).toBe("Marie Tremblay");20 expect(r.data.email).toBe("marie@exemple.com");21 }22 });2324 it("refuse l'injection d'en-têtes dans le sujet", () => {25 const r = contactSchema.safeParse({ ...valid, subject: "Sujet\r\nBcc: spam@exemple.com" });26 expect(r.success).toBe(false);27 });2829 it("exige le consentement", () => {30 expect(contactSchema.safeParse({ ...valid, consent: false }).success).toBe(false);31 });3233 it("refuse un message trop court ou trop long", () => {34 expect(contactSchema.safeParse({ ...valid, message: "court" }).success).toBe(false);35 expect(contactSchema.safeParse({ ...valid, message: "x".repeat(4001) }).success).toBe(false);36 });3738 it("détecte le honeypot rempli", () => {39 const r = contactSchema.safeParse({ ...valid, website: "http://spam" });40 expect(r.success).toBe(false);41 if (!r.success) expect(r.error.issues.some((i) => i.path[0] === "website")).toBe(true);42 });4344 it("retire les caractères de contrôle", () => {45 expect(cleanText("abc\u0000\u0007def ghi")).toBe("abcdef ghi");46 });47});48