/** * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai * Project: Hilmacorp.ai — Web Platform * File: tests/contact-validation.test.mjs * Description: Unit tests for the contact form validation used by the /api/contact route */ import { test } from "node:test"; import assert from "node:assert/strict"; import { validateContact } from "../lib/validate.ts"; test("accepts a valid payload", () => { const result = validateContact({ name: "Jane Doe", organization: "Acme Inc.", email: "jane@acme.com", message: "We would like to discuss an AI project.", }); assert.equal(result.ok, true); assert.deepEqual(result.errors, {}); assert.equal(result.data?.name, "Jane Doe"); }); test("organization is optional", () => { const result = validateContact({ name: "Jane Doe", organization: "", email: "jane@acme.com", message: "A perfectly valid message.", }); assert.equal(result.ok, true); }); test("rejects a missing name", () => { const result = validateContact({ name: "", email: "jane@acme.com", message: "A perfectly valid message.", }); assert.equal(result.ok, false); assert.equal(result.errors.name, "invalid_name"); }); test("rejects an invalid email", () => { for (const email of ["", "not-an-email", "a@b", "a b@c.com"]) { const result = validateContact({ name: "Jane Doe", email, message: "A perfectly valid message.", }); assert.equal(result.ok, false, `expected rejection for email: "${email}"`); assert.equal(result.errors.email, "invalid_email"); } }); test("rejects a message that is too short", () => { const result = validateContact({ name: "Jane Doe", email: "jane@acme.com", message: "hi", }); assert.equal(result.ok, false); assert.equal(result.errors.message, "invalid_message"); }); test("trims whitespace and handles non-string input safely", () => { const result = validateContact({ name: " Jane Doe ", organization: 42, email: " jane@acme.com ", message: " A perfectly valid message. ", }); assert.equal(result.ok, true); assert.equal(result.data?.name, "Jane Doe"); assert.equal(result.data?.organization, ""); }); test("handles null and garbage payloads without throwing", () => { for (const payload of [null, undefined, "string", 12, []]) { const result = validateContact(payload); assert.equal(result.ok, false); } }); test("caps oversized fields instead of rejecting them", () => { const result = validateContact({ name: "Jane Doe", email: "jane@acme.com", message: "x".repeat(10000), }); assert.equal(result.ok, true); assert.equal(result.data?.message.length, 5000); });