test: add comprehensive automated test coverage
- 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
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { buildSiteIconResponse, buildSiteIconUrls } from "@/lib/site-icons";
|
||||
|
||||
describe("buildSiteIconUrls", () => {
|
||||
it("uses the default version when none is provided", () => {
|
||||
const urls = buildSiteIconUrls({ siteName: "Studio" });
|
||||
expect(urls.version).toBe("default");
|
||||
expect(urls.faviconHref).toBe("/favicon.ico?v=default");
|
||||
expect(urls.appleIconHref).toBe("/apple-icon.png?v=default");
|
||||
expect(urls.manifestHref).toBe("/manifest.webmanifest?v=default");
|
||||
expect(urls.faviconAssetUrl).toBeNull();
|
||||
});
|
||||
|
||||
it("applies a provided favicon version to internal icon hrefs", () => {
|
||||
const urls = buildSiteIconUrls({ siteName: "Studio", faviconVersion: "v1" });
|
||||
expect(urls.faviconHref).toBe("/favicon.ico?v=v1");
|
||||
expect(urls.appleIconHref).toBe("/apple-icon.png?v=v1");
|
||||
});
|
||||
|
||||
it("versions a relative favicon asset url", () => {
|
||||
const urls = buildSiteIconUrls({
|
||||
siteName: "Studio",
|
||||
faviconVersion: "v2",
|
||||
faviconUrl: "/uploads/media/site-settings/favicon.svg",
|
||||
});
|
||||
expect(urls.faviconAssetUrl).toBe("/uploads/media/site-settings/favicon.svg?v=v2");
|
||||
});
|
||||
|
||||
it("versions an absolute favicon asset url", () => {
|
||||
const urls = buildSiteIconUrls({
|
||||
siteName: "Studio",
|
||||
faviconVersion: "v3",
|
||||
faviconUrl: "https://cdn.example.com/favicon.png",
|
||||
});
|
||||
expect(urls.faviconAssetUrl).toBe("https://cdn.example.com/favicon.png?v=v3");
|
||||
});
|
||||
|
||||
it("falls back to a default site name when empty", () => {
|
||||
expect(buildSiteIconUrls({ siteName: " " }).siteName).toBe("Moh");
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildSiteIconResponse", () => {
|
||||
it("returns a transparent png for a null icon url", async () => {
|
||||
const response = await buildSiteIconResponse(null);
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers.get("Content-Type")).toBe("image/png");
|
||||
expect(response.headers.get("Cache-Control")).toBe("no-store, max-age=0");
|
||||
const bytes = new Uint8Array(await response.arrayBuffer());
|
||||
// PNG magic number
|
||||
expect(Array.from(bytes.slice(0, 4))).toEqual([0x89, 0x50, 0x4e, 0x47]);
|
||||
});
|
||||
|
||||
it("returns the transparent fallback for unmanaged paths", async () => {
|
||||
const response = await buildSiteIconResponse("https://example.com/external.png");
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers.get("Content-Type")).toBe("image/png");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user