SPB Git

spb/phi-conseil

Public
1.6 KB · 48 lines typescript
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
Files · main
Menu

Theme