Files
community-rule/tests/unit/uploadsByIdRoute.test.ts
T
2026-05-22 13:30:47 -06:00

63 lines
2.0 KiB
TypeScript

import { mkdtemp, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import path from "node:path";
import { NextRequest } from "next/server";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const getUploadRootFromEnvMock = vi.fn();
let uploadRoot: string | null = null;
vi.mock("../../lib/server/uploads/uploadRoot", () => ({
getUploadRootFromEnv: () => getUploadRootFromEnvMock(),
}));
import { GET } from "../../app/api/uploads/[id]/route";
beforeEach(async () => {
uploadRoot = await mkdtemp(path.join(tmpdir(), "cr-upload-test-"));
getUploadRootFromEnvMock.mockReset();
getUploadRootFromEnvMock.mockImplementation(() => uploadRoot);
});
afterEach(() => {
uploadRoot = null;
});
describe("GET /api/uploads/[id]", () => {
it("returns 500 when UPLOAD_ROOT is unset", async () => {
getUploadRootFromEnvMock.mockReturnValueOnce(null);
const res = await GET(
new NextRequest("https://x.test/api/uploads/upload-1"),
{ params: Promise.resolve({ id: "upload-1" }) },
);
expect(res.status).toBe(500);
});
it("returns 404 when the upload is not found", async () => {
const res = await GET(
new NextRequest(
"https://x.test/api/uploads/550e8400-e29b-41d4-a716-446655440000",
),
{
params: Promise.resolve({
id: "550e8400-e29b-41d4-a716-446655440000",
}),
},
);
expect(res.status).toBe(404);
});
it("returns the file bytes with content type", async () => {
const id = "550e8400-e29b-41d4-a716-446655440000";
await writeFile(path.join(uploadRoot!, `${id}.png`), "png-bytes");
const res = await GET(
new NextRequest(`https://x.test/api/uploads/${id}`),
{ params: Promise.resolve({ id }) },
);
expect(res.status).toBe(200);
expect(res.headers.get("Content-Type")).toBe("image/png");
expect(res.headers.get("Cache-Control")).toContain("immutable");
expect(await res.text()).toBe("png-bytes");
});
});