- Vitest multi-project setup (unit / integration / component) - Real-Postgres integration harness via in-process PGlite (TEST_DATABASE_URL override), migrations applied per worker; production code untouched - Unit: routing, locale, validation/Zod schemas, metadata, mail, site-theme, marquee, media, portfolio helpers, plus architecture-rule tests - Integration: Prisma data layer, API routes, and all server actions - Component: UI primitives and form components (jsdom + Testing Library) - 371 tests passing
65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { mediaFieldInputSchema } from "@/lib/media-validation";
|
|
|
|
const base = { assetId: "", url: "", label: "", kind: "IMAGE" as const };
|
|
|
|
describe("mediaFieldInputSchema", () => {
|
|
it("accepts a valid library selection", () => {
|
|
const parsed = mediaFieldInputSchema.parse({ ...base, mode: "library", assetId: "asset_1" });
|
|
expect(parsed.mode).toBe("library");
|
|
expect(parsed.assetId).toBe("asset_1");
|
|
});
|
|
|
|
it("requires an assetId in library mode", () => {
|
|
expect(() => mediaFieldInputSchema.parse({ ...base, mode: "library" })).toThrow(/media asset/i);
|
|
});
|
|
|
|
it("accepts a valid external url", () => {
|
|
const parsed = mediaFieldInputSchema.parse({ ...base, mode: "external", url: "https://cdn/x.png" });
|
|
expect(parsed.url).toBe("https://cdn/x.png");
|
|
});
|
|
|
|
it("accepts a root-relative external url", () => {
|
|
const parsed = mediaFieldInputSchema.parse({ ...base, mode: "external", url: "/uploads/media/x.png" });
|
|
expect(parsed.url).toBe("/uploads/media/x.png");
|
|
});
|
|
|
|
it("requires a url in external mode", () => {
|
|
expect(() => mediaFieldInputSchema.parse({ ...base, mode: "external" })).toThrow(/URL/i);
|
|
});
|
|
|
|
it("rejects malformed urls", () => {
|
|
expect(() =>
|
|
mediaFieldInputSchema.parse({ ...base, mode: "external", url: "not-a-url" }),
|
|
).toThrow(/absolute URL or start with/i);
|
|
});
|
|
|
|
it("accepts upload mode without asset or url", () => {
|
|
const parsed = mediaFieldInputSchema.parse({ ...base, mode: "upload" });
|
|
expect(parsed.mode).toBe("upload");
|
|
});
|
|
|
|
it("rejects an unknown mode", () => {
|
|
expect(() => mediaFieldInputSchema.parse({ ...base, mode: "sideload" })).toThrow();
|
|
});
|
|
|
|
it("rejects an invalid media kind", () => {
|
|
expect(() =>
|
|
mediaFieldInputSchema.parse({ ...base, mode: "upload", kind: "VIDEO" }),
|
|
).toThrow();
|
|
});
|
|
|
|
it("trims text fields and defaults optionals to empty strings", () => {
|
|
const parsed = mediaFieldInputSchema.parse({
|
|
mode: "library",
|
|
assetId: " asset_9 ",
|
|
label: " Logo ",
|
|
kind: "IMAGE",
|
|
});
|
|
expect(parsed.assetId).toBe("asset_9");
|
|
expect(parsed.label).toBe("Logo");
|
|
expect(parsed.url).toBe("");
|
|
});
|
|
});
|