63 lines
2.0 KiB
TypeScript
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");
|
|
});
|
|
});
|