mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 08:28:19 +01:00
124 lines
4.4 KiB
TypeScript
124 lines
4.4 KiB
TypeScript
/**
|
|
* @packageDocumentation
|
|
* @module Tests/MediaManager
|
|
*/
|
|
|
|
import { beforeEach, describe, expect, it, mock } from "bun:test";
|
|
import type { Config } from "~/packages/config-manager/config.type";
|
|
import { MediaBackendType } from "~/packages/config-manager/config.type";
|
|
import { DiskMediaDriver } from "./drivers/disk.ts";
|
|
import { S3MediaDriver } from "./drivers/s3.ts";
|
|
import { MediaManager } from "./media-manager.ts";
|
|
import type { ImageConversionPreprocessor } from "./preprocessors/image-conversion.ts";
|
|
|
|
describe("MediaManager", () => {
|
|
let mediaManager: MediaManager;
|
|
let mockConfig: Config;
|
|
let mockS3Driver: S3MediaDriver;
|
|
let mockImagePreprocessor: ImageConversionPreprocessor;
|
|
|
|
beforeEach(() => {
|
|
mockConfig = {
|
|
media: {
|
|
backend: "s3",
|
|
conversion: {
|
|
convert_images: true,
|
|
convert_to: "image/webp",
|
|
},
|
|
},
|
|
s3: {
|
|
endpoint: "s3.amazonaws.com",
|
|
region: "us-west-2",
|
|
bucket_name: "test-bucket",
|
|
access_key: "test-key",
|
|
secret_access_key: "test-secret",
|
|
},
|
|
} as Config;
|
|
|
|
mockS3Driver = mock(() => ({
|
|
addFile: mock(() =>
|
|
Promise.resolve({
|
|
uploadedFile: new File(["hey"], "test.webp"),
|
|
path: "test/test.webp",
|
|
hash: "testhash",
|
|
}),
|
|
),
|
|
getFileByHash: mock(() => {
|
|
return Promise.resolve(new File(["hey"], "test.webp"));
|
|
}),
|
|
getFile: mock(() =>
|
|
Promise.resolve(new File(["hey"], "test.webp")),
|
|
),
|
|
deleteFileByUrl: mock(() => Promise.resolve()),
|
|
}))() as unknown as S3MediaDriver;
|
|
|
|
mockImagePreprocessor = mock(() => ({
|
|
process: mock((_: File) =>
|
|
Promise.resolve(new File(["hey"], "test.webp")),
|
|
),
|
|
}))() as unknown as ImageConversionPreprocessor;
|
|
|
|
mediaManager = new MediaManager(mockConfig);
|
|
// @ts-expect-error: Accessing private property for testing
|
|
mediaManager.driver = mockS3Driver;
|
|
// @ts-expect-error: Accessing private property for testing
|
|
mediaManager.preprocessors = [mockImagePreprocessor];
|
|
});
|
|
|
|
it("should initialize with the correct driver based on config", () => {
|
|
const s3Manager = new MediaManager(mockConfig);
|
|
// @ts-expect-error: Accessing private property for testing
|
|
expect(s3Manager.driver).toBeInstanceOf(S3MediaDriver);
|
|
|
|
mockConfig.media.backend = MediaBackendType.Local;
|
|
const diskManager = new MediaManager(mockConfig);
|
|
// @ts-expect-error: Accessing private property for testing
|
|
expect(diskManager.driver).toBeInstanceOf(DiskMediaDriver);
|
|
});
|
|
|
|
it("should add a file with preprocessing", async () => {
|
|
const file = new File(["test"], "test.jpg", { type: "image/jpeg" });
|
|
const result = await mediaManager.addFile(file);
|
|
|
|
expect(mockImagePreprocessor.process).toHaveBeenCalledWith(file);
|
|
expect(mockS3Driver.addFile).toHaveBeenCalled();
|
|
expect(result).toEqual({
|
|
uploadedFile: new File(["hey"], "test.webp"),
|
|
path: "test/test.webp",
|
|
hash: "testhash",
|
|
});
|
|
});
|
|
|
|
it("should get a file by hash", async () => {
|
|
const hash = "testhash";
|
|
const databaseHashFetcher = mock(() => Promise.resolve("test.webp"));
|
|
const result = await mediaManager.getFileByHash(
|
|
hash,
|
|
databaseHashFetcher,
|
|
);
|
|
|
|
expect(mockS3Driver.getFileByHash).toHaveBeenCalledWith(
|
|
hash,
|
|
databaseHashFetcher,
|
|
);
|
|
expect(result).toBeInstanceOf(File);
|
|
expect(result?.name).toBe("test.webp");
|
|
});
|
|
|
|
it("should get a file by filename", async () => {
|
|
const filename = "test.webp";
|
|
const result = await mediaManager.getFile(filename);
|
|
|
|
expect(mockS3Driver.getFile).toHaveBeenCalledWith(filename);
|
|
expect(result).toBeInstanceOf(File);
|
|
expect(result?.name).toBe("test.webp");
|
|
});
|
|
|
|
it("should delete a file by URL", async () => {
|
|
const url = "https://test-bucket.s3.amazonaws.com/test/test.webp";
|
|
await mediaManager.deleteFileByUrl(url);
|
|
|
|
expect(mockS3Driver.deleteFileByUrl).toHaveBeenCalledWith(url);
|
|
});
|
|
});
|