Files
EpicNext-Cms/src/lib/validators/poll.test.ts
T
openhands 17847545dd
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m52s
Improvements: remove dead config, fix ESM, add URL validation, unify types, add missing logging
- Remove .prettierrc (dead config, Biome replaces Prettier)
- Rename lighthouserc.json to lighthouserc.cjs with module.exports for ESM compat
- Add logger.warn to empty catch blocks in auth, register, site-settings, prisma-cache, redis, security, rate-limit
- Unify ActionResult type: action-helper.ts uses 'ok' consistent with safe-action-shared.ts
- Add noUnusedLocals + noUnusedParameters to tsconfig + fix 25 pre-existing unused vars
- Replace barrel export src/types/index.ts with direct @/types/common imports
- Make trustHost conditional (development only) in auth.ts
- Add pre-flight URL validation to update-Nitrov3.sh to catch image.library.url misconfigurations
- Improve NITRO_IMAGE_LIBRARY_URL content validation in pre-flight & post-compute checks
2026-07-26 20:28:11 +02:00

138 lines
3.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
createPollSchema,
pollQuestionSchema,
pollVoteSchema,
updatePollSchema,
voteOnPollSchema,
} from "./poll";
describe("createPollSchema", () => {
it("accepts valid input", () => {
const result = createPollSchema.safeParse({
title: "My Poll",
description: "A test poll",
});
expect(result.success).toBe(true);
if (result.success) {
expect(result.data.title).toBe("My Poll");
expect(result.data.status).toBe("draft");
expect(result.data.showResults).toBe(1);
}
});
it("rejects empty title", () => {
expect(createPollSchema.safeParse({ title: "" }).success).toBe(false);
expect(createPollSchema.safeParse({}).success).toBe(false);
});
});
describe("createPollSchema defaults", () => {
it("defaults status to draft", () => {
const result = createPollSchema.safeParse({ title: "Test" });
if (result.success) expect(result.data.status).toBe("draft");
});
it("defaults showResults to 1", () => {
const result = createPollSchema.safeParse({ title: "Test" });
if (result.success) expect(result.data.showResults).toBe(1);
});
it("defaults multipleChoice to 0", () => {
const result = createPollSchema.safeParse({ title: "Test" });
if (result.success) expect(result.data.multipleChoice).toBe(0);
});
});
describe("pollQuestionSchema", () => {
it("accepts valid question", () => {
const result = pollQuestionSchema.safeParse({
pollId: 1,
question: "What is your favorite color?",
options: "Red|Blue|Green",
});
expect(result.success).toBe(true);
if (result.success) {
expect(result.data.type).toBe("single");
expect(result.data.sortOrder).toBe(0);
}
});
it("rejects empty question", () => {
expect(
pollQuestionSchema.safeParse({ pollId: 1, question: "", options: "Red" })
.success,
).toBe(false);
});
it("rejects missing pollId", () => {
expect(
pollQuestionSchema.safeParse({ question: "Test?", options: "A" }).success,
).toBe(false);
});
});
describe("pollVoteSchema", () => {
it("accepts valid vote", () => {
const result = pollVoteSchema.safeParse({
questionId: 5,
answer: "Option A",
});
expect(result.success).toBe(true);
});
it("rejects empty answer", () => {
expect(
pollVoteSchema.safeParse({ questionId: 5, answer: "" }).success,
).toBe(false);
});
it("rejects non-positive questionId", () => {
expect(
pollVoteSchema.safeParse({ questionId: 0, answer: "x" }).success,
).toBe(false);
});
});
describe("voteOnPollSchema", () => {
it("accepts valid vote batch", () => {
const result = voteOnPollSchema.safeParse({
pollId: 1,
votes: [
{ questionId: 1, answer: "Yes" },
{ questionId: 2, answer: "No" },
],
});
expect(result.success).toBe(true);
});
it("rejects empty votes array", () => {
expect(voteOnPollSchema.safeParse({ pollId: 1, votes: [] }).success).toBe(
false,
);
});
it("rejects too many votes (more than 50)", () => {
const votes = Array.from({ length: 51 }, (_, i) => ({
questionId: i + 1,
answer: `Answer ${i + 1}`,
}));
expect(voteOnPollSchema.safeParse({ pollId: 1, votes }).success).toBe(
false,
);
});
});
describe("updatePollSchema", () => {
it("is partial (all fields optional)", () => {
const result = updatePollSchema.safeParse({});
expect(result.success).toBe(true);
});
it("accepts subset of fields", () => {
const result = updatePollSchema.safeParse({ title: "New Title" });
if (result.success) expect(result.data.title).toBe("New Title");
});
});