feat: add zod-based validation for webhook and form payloads

This commit is contained in:
Codex
2026-02-18 13:15:13 +00:00
parent 81d5e7faf5
commit 6b1f9cddbc
3 changed files with 146 additions and 28 deletions

56
test/validation.test.js Normal file
View File

@@ -0,0 +1,56 @@
"use strict";
const test = require("node:test");
const assert = require("node:assert/strict");
const {
XWebhookPayloadSchema,
PolarWebhookPayloadSchema,
LoginFormSchema,
TopUpFormSchema,
SimulateMentionFormSchema,
parseOrThrow,
} = require("../src/lib/validation");
test("validates X webhook payload", () => {
const parsed = parseOrThrow(XWebhookPayloadSchema, {
mentionPostId: "m1",
callerUserId: "u1",
parentPost: { id: "p1", article: { body: "x" } },
});
assert.equal(parsed.mentionPostId, "m1");
});
test("validates Polar webhook payload with numeric coercion", () => {
const parsed = parseOrThrow(PolarWebhookPayloadSchema, {
userId: "u1",
credits: "12",
eventId: "evt-1",
});
assert.equal(parsed.credits, 12);
});
test("rejects invalid login username", () => {
assert.throws(
() => parseOrThrow(LoginFormSchema, { userId: "!" }),
/Username must be 2-40 characters using letters, numbers, _ or -/,
);
});
test("validates topup amount range", () => {
assert.throws(() => parseOrThrow(TopUpFormSchema, { amount: "999" }), /Too big/);
const parsed = parseOrThrow(TopUpFormSchema, { amount: "20" });
assert.equal(parsed.amount, 20);
});
test("validates simulate mention form", () => {
const parsed = parseOrThrow(SimulateMentionFormSchema, {
title: "Hello",
body: "World",
});
assert.equal(parsed.title, "Hello");
assert.equal(parsed.body, "World");
});