import { Resource } from "@noya-app/noya-schemas"; import { describe, expect, it } from "bun:test"; import { ResourceManager, getResourceTransformUrl } from "../ResourceManager"; import { RPCManager } from "../rpcManager"; const resource = { id: "resource-id", stableId: "resource-stable-id", path: "image.png", type: "asset", assetId: "asset-id", createdAt: "2026-01-01T00:00:00.000Z", updatedAt: "2026-01-01T00:00:00.000Z", accessibleByFileId: null, accessibleByFileVersionId: null, } satisfies Resource; describe("ResourceManager", () => { it("adds absolute transform URLs using the configured base", () => { const manager = new ResourceManager(new RPCManager(), { initialResources: [resource], resourceUrlBase: "https://www.noya.io/embedded/path", }); expect(manager.resources$.get()[0].url).toBe( "https://www.noya.io/api/transform/resource-id?format=image" ); }); it("preserves resource URLs supplied by the server", () => { const manager = new ResourceManager(new RPCManager(), { initialResources: [ { ...resource, url: "https://cdn.example.com/image.png" }, ], resourceUrlBase: "https://www.noya.io", }); expect(manager.resources$.get()[0].url).toBe( "https://cdn.example.com/image.png" ); }); it("selects the image format on server transform capabilities", () => { const manager = new ResourceManager(new RPCManager(), { initialResources: [ { ...resource, transformUrl: "https://www.noya.io/api/transform/resource-id?token=signed-token", }, ], }); expect(manager.resources$.get()[0]).toMatchObject({ transformUrl: "https://www.noya.io/api/transform/resource-id?token=signed-token", url: "https://www.noya.io/api/transform/resource-id?token=signed-token&format=image", }); }); it("prefers a signed transform capability over a supplied resource URL", () => { const manager = new ResourceManager(new RPCManager(), { initialResources: [ { ...resource, url: "https://cdn.example.com/image.png", transformUrl: "https://www.noya.io/api/transform/resource-id?token=signed-token", }, ], }); expect(manager.resources$.get()[0].url).toBe( "https://www.noya.io/api/transform/resource-id?token=signed-token&format=image" ); }); it("builds other formats from the same transform capability", () => { const url = getResourceTransformUrl( { id: resource.id, transformUrl: "https://www.noya.io/api/transform/resource-id?token=signed-token", }, { format: "html", inputs: { theme: "dark" } } ); const parsed = new URL(url); expect(parsed.searchParams.get("token")).toBe("signed-token"); expect(parsed.searchParams.get("format")).toBe("html"); expect(parsed.searchParams.get("inputs")).toBe('{"theme":"dark"}'); }); it("makes relative resource URLs absolute", () => { const manager = new ResourceManager(new RPCManager(), { initialResources: [{ ...resource, url: "/api/custom/resource-id" }], resourceUrlBase: "https://www.noya.io", }); expect(manager.resources$.get()[0].url).toBe( "https://www.noya.io/api/custom/resource-id" ); }); });