55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import { mkdir, stat, writeFile } from "fs/promises";
|
|
import path from "path";
|
|
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
MEDIA_UPLOAD_ROOT,
|
|
isManagedMediaFilePath,
|
|
removeManagedMediaFile,
|
|
resolveMediaUploadPath,
|
|
sanitizeBaseName,
|
|
} from "../lib/media-storage";
|
|
|
|
const createdFiles: string[] = [];
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(
|
|
createdFiles.splice(0).map(async (filePath) => {
|
|
await removeManagedMediaFile(filePath);
|
|
}),
|
|
);
|
|
});
|
|
|
|
describe("media storage helpers", () => {
|
|
it("sanitizes upload names safely", () => {
|
|
expect(sanitizeBaseName("Brand Redesign 2026!.svg")).toBe("brand-redesign-2026-svg");
|
|
});
|
|
|
|
it("detects managed media upload paths", () => {
|
|
expect(isManagedMediaFilePath("/uploads/media/covers/test.svg")).toBe(true);
|
|
expect(isManagedMediaFilePath("https://example.com/test.svg")).toBe(false);
|
|
expect(isManagedMediaFilePath("../test.svg")).toBe(false);
|
|
});
|
|
|
|
it("resolves managed paths inside the upload root", () => {
|
|
const resolvedPath = resolveMediaUploadPath("/uploads/media/assets/test.svg");
|
|
|
|
expect(resolvedPath.startsWith(MEDIA_UPLOAD_ROOT)).toBe(true);
|
|
expect(resolvedPath.endsWith(path.join("assets", "test.svg"))).toBe(true);
|
|
});
|
|
|
|
it("removes a managed file from disk", async () => {
|
|
const relativePath = `/uploads/media/tests/${Date.now()}-temp.txt`;
|
|
const absolutePath = resolveMediaUploadPath(relativePath);
|
|
|
|
await mkdir(path.dirname(absolutePath), { recursive: true });
|
|
await writeFile(absolutePath, "temporary-test-file", "utf8");
|
|
createdFiles.push(relativePath);
|
|
|
|
await expect(stat(absolutePath)).resolves.toBeDefined();
|
|
await expect(removeManagedMediaFile(relativePath)).resolves.toBe(true);
|
|
await expect(stat(absolutePath)).rejects.toThrow();
|
|
});
|
|
});
|