Skip to content
File

Blob: tests/worker/routes/pages-cover.workers.test.ts

typescript49 lines
1import { beforeEach, describe, expect, it } from "vitest";
2 
3import { GRADIENT_PRESETS } from "@/shared/page-cover";
4import { resetD1Tables } from "@tests/worker/helpers/db";
5import { apiRequest } from "@tests/worker/helpers/request";
6import { seedPage, seedUser, seedWorkspace } from "@tests/worker/helpers/seeds";
7 
8describe("PATCH /workspaces/:wid/pages/:id cover_url", () => {
9 beforeEach(async () => {
10 await resetD1Tables();
11 });
12 
13 it("accepts null, upload cover URLs, and shared gradient presets", async () => {
14 const owner = await seedUser();
15 const ws = await seedWorkspace({ owner_id: owner.id });
16 const page = await seedPage({ workspace_id: ws.id, created_by: owner.id });
17 
18 for (const cover_url of [GRADIENT_PRESETS[0], "/uploads/upload_cover", null]) {
19 const res = await apiRequest(`/api/v1/workspaces/${ws.id}/pages/${page.id}`, {
20 method: "PATCH",
21 body: { cover_url },
22 userId: owner.id,
23 });
24 expect(res.status).toBe(200);
25 await expect(res.json()).resolves.toMatchObject({ page: { cover_url } });
26 }
27 });
28 
29 it("rejects arbitrary gradients and malformed upload paths", async () => {
30 const owner = await seedUser();
31 const ws = await seedWorkspace({ owner_id: owner.id });
32 const page = await seedPage({ workspace_id: ws.id, created_by: owner.id });
33 
34 for (const cover_url of [
35 "linear-gradient(90deg, #000000 0%, #ffffff 100%)",
36 "radial-gradient(#000000 0%, #ffffff 100%)",
37 "/uploads/upload_cover/extra",
38 "https://example.com/cover.png",
39 ]) {
40 const res = await apiRequest(`/api/v1/workspaces/${ws.id}/pages/${page.id}`, {
41 method: "PATCH",
42 body: { cover_url },
43 userId: owner.id,
44 });
45 expect(res.status).toBe(400);
46 }
47 });
48});