import { describe, expect, it, vi } from "vitest"; import { loadMediaSettings, MEDIA_SETTINGS_ID, MediaSettingsInvalidError, mediaSettingsView, normalizeComfyUiBaseUrl, normalizeTranscriptionBaseUrl, saveMediaSettings, } from "./media-settings.js"; import { EncryptedSecretStore } from "./secrets.js"; function store() { const rows = new Map(); const prisma = { integrationProviderConfig: { findUnique: vi.fn(async ({ where }: { where: { id: string } }) => rows.get(where.id) ?? null), upsert: vi.fn( async ({ where, create }: { where: { id: string }; create: { ciphertext: string } }) => { const row = { id: where.id, ciphertext: create.ciphertext }; rows.set(where.id, row); return row; }, ), deleteMany: vi.fn(async ({ where }: { where: { id: string } }) => { rows.delete(where.id); return { count: 1 }; }), }, }; const secrets = new EncryptedSecretStore("test-encryption-key-for-media-settings"); return { deps: { prisma: prisma as never, secrets }, rows, prisma, secrets }; } describe("media settings", () => { it("normalizes server URLs and refuses ones that are not allowed", () => { expect(normalizeComfyUiBaseUrl(" http://127.0.0.1:8188/ ")).toBe("http://127.0.0.1:8188"); expect(normalizeComfyUiBaseUrl("http://192.168.1.20:8188/comfy/?x=1#y")).toBe( "http://192.168.1.20:8188/comfy", ); expect(normalizeTranscriptionBaseUrl("http://127.0.0.1:8080")).toBe("http://127.0.0.1:8080/v1"); expect(normalizeTranscriptionBaseUrl("http://127.0.0.1:8080/v1/")).toBe( "http://127.0.0.1:8080/v1", ); for (const url of ["ftp://127.0.0.1", "http://169.254.169.254", "not a url"]) { expect(() => normalizeComfyUiBaseUrl(url), url).toThrow(); } expect(() => normalizeComfyUiBaseUrl("http://user:pass@127.0.0.1:8188")).toThrow("credentials"); }); it("stores the settings encrypted and returns a view without keys", async () => { const { deps, rows } = store(); const view = await saveMediaSettings(deps, { comfyui: { baseUrl: "http://127.0.0.1:8188", apiKey: "comfy-key" }, transcription: null, }); expect(view).toEqual({ comfyui: { baseUrl: "http://127.0.0.1:8188", hasApiKey: true }, transcription: null, }); expect(rows.get(MEDIA_SETTINGS_ID)?.ciphertext).not.toContain("comfy-key"); expect(await loadMediaSettings(deps)).toEqual({ comfyui: { baseUrl: "http://127.0.0.1:8188", apiKey: "comfy-key" }, transcription: null, }); expect( mediaSettingsView({ comfyui: null, transcription: { baseUrl: "http://127.0.0.1:8080/v1", apiKey: "k", model: "m" }, }), ).toEqual({ comfyui: null, transcription: { baseUrl: "http://127.0.0.1:8080/v1", model: "m", hasApiKey: true }, }); }); it("decrypts once per saved version", async () => { const { deps, secrets } = store(); await saveMediaSettings(deps, { comfyui: { baseUrl: "http://127.0.0.1:8188" }, transcription: null, }); const load = vi.spyOn(secrets, "load"); await loadMediaSettings(deps); await loadMediaSettings(deps); expect(load).not.toHaveBeenCalled(); }); it("keeps a saved key only for the same server, removes it when cleared", async () => { const { deps } = store(); await saveMediaSettings(deps, { comfyui: null, transcription: { baseUrl: "http://127.0.0.1:8080", apiKey: "t-key" }, }); await saveMediaSettings(deps, { comfyui: null, transcription: { baseUrl: "http://127.0.0.1:8080/v1", model: "whisper-1" }, }); expect((await loadMediaSettings(deps)).transcription?.apiKey).toBe("t-key"); await saveMediaSettings(deps, { comfyui: null, transcription: { baseUrl: "http://127.0.0.1:9090" }, }); expect((await loadMediaSettings(deps)).transcription?.apiKey).toBeUndefined(); await saveMediaSettings(deps, { comfyui: null, transcription: { baseUrl: "http://127.0.0.1:9090", apiKey: "new" }, }); await saveMediaSettings(deps, { comfyui: null, transcription: { baseUrl: "http://127.0.0.1:9090", apiKey: "" }, }); expect((await loadMediaSettings(deps)).transcription?.apiKey).toBeUndefined(); }); it("refuses invalid settings with a message for the owner and removes empty ones", async () => { const { deps, rows } = store(); await expect( saveMediaSettings(deps, { comfyui: { baseUrl: "http://169.254.169.254" }, transcription: null, }), ).rejects.toBeInstanceOf(MediaSettingsInvalidError); expect(rows.size).toBe(0); await saveMediaSettings(deps, { comfyui: { baseUrl: "http://127.0.0.1:8188" }, transcription: null, }); expect(await saveMediaSettings(deps, { comfyui: null, transcription: null })).toEqual({ comfyui: null, transcription: null, }); expect(rows.size).toBe(0); expect(await loadMediaSettings(deps)).toEqual({ comfyui: null, transcription: null }); }); });