Files
EpicNext-Cms/src/lib/services/furni-asset-dirs.test.ts
T

88 lines
2.5 KiB
TypeScript

// @vitest-environment node
import path from "node:path";
import { beforeEach, describe, expect, it, vi } from "vitest";
const { existsSyncMock, settingGetMock } = vi.hoisted(() => ({
existsSyncMock: vi.fn(),
settingGetMock: vi.fn(),
}));
vi.mock("node:fs", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs")>();
return { ...actual, existsSync: existsSyncMock };
});
vi.mock("@/lib/services/site-settings", () => ({
siteSettings: { get: settingGetMock },
}));
import { getFurniAssetWriteTargets } from "./furni-asset-dirs";
const primary = {
swfDir: path.join("test-assets", "primary", "swf"),
iconDir: path.join("test-assets", "primary", "icons"),
nitroDir: path.join("test-assets", "primary", "furniture"),
};
function configureSettings(values: Record<string, string>): void {
settingGetMock.mockImplementation(
async (key: string, fallback: string | null = null) =>
values[key] ?? fallback,
);
}
describe("getFurniAssetWriteTargets", () => {
beforeEach(() => {
vi.clearAllMocks();
existsSyncMock.mockReturnValue(false);
});
it("maps a configured production Gamedata root to the directories served by Nitro", async () => {
const gamedataRoot = path.join("test-assets", "Gamedata");
configureSettings({
furni_swf_dir: primary.swfDir,
furni_icon_dir: primary.iconDir,
furni_nitro_dir: primary.nitroDir,
nitro_files_root: "",
gamedata_root: gamedataRoot,
});
const targets = await getFurniAssetWriteTargets();
expect(targets.mirrorDirs).toContainEqual({
swfDir: primary.swfDir,
iconDir: path.join(gamedataRoot, "icons"),
nitroDir: path.join(gamedataRoot, "bundled", "furniture"),
});
});
it("does not add a production mirror when no root is configured or present", async () => {
configureSettings({
furni_swf_dir: primary.swfDir,
furni_icon_dir: primary.iconDir,
furni_nitro_dir: primary.nitroDir,
nitro_files_root: "",
gamedata_root: "",
});
const targets = await getFurniAssetWriteTargets();
expect(targets.mirrorDirs).toEqual([]);
});
it("does not duplicate a Gamedata layout already used as the primary target", async () => {
const gamedataRoot = path.join("test-assets", "Gamedata");
configureSettings({
furni_swf_dir: primary.swfDir,
furni_icon_dir: path.join(gamedataRoot, "icons"),
furni_nitro_dir: path.join(gamedataRoot, "bundled", "furniture"),
nitro_files_root: "",
gamedata_root: gamedataRoot,
});
const targets = await getFurniAssetWriteTargets();
expect(targets.mirrorDirs).toEqual([]);
});
});