diff --git a/canvas/src/store/__tests__/socket.url.test.ts b/canvas/src/store/__tests__/socket.url.test.ts index 563005ab..d572f378 100644 --- a/canvas/src/store/__tests__/socket.url.test.ts +++ b/canvas/src/store/__tests__/socket.url.test.ts @@ -1,23 +1,5 @@ import { describe, it, expect, vi, afterEach } from "vitest"; -// Helper: reset modules, set env vars, import module, then restore env. -async function importWsUrl(env: Record) { - vi.resetModules(); - const saved: Record = {}; - for (const [k, v] of Object.entries(env)) { - saved[k] = process.env[k]; - if (v === undefined) delete process.env[k]; - else process.env[k] = v; - } - const mod = await import("@/store/socket"); - // Restore env - for (const [k, v] of Object.entries(saved)) { - if (v === undefined) delete process.env[k]; - else process.env[k] = v; - } - return mod; -} - describe("socket WS_URL derivation", () => { afterEach(() => { vi.resetModules(); @@ -26,34 +8,34 @@ describe("socket WS_URL derivation", () => { }); it("falls back to ws://localhost:8080/ws when no env vars are set", async () => { - const mod = await importWsUrl({ - NEXT_PUBLIC_PLATFORM_URL: undefined, - NEXT_PUBLIC_WS_URL: undefined, - }); + vi.resetModules(); + delete process.env.NEXT_PUBLIC_PLATFORM_URL; + delete process.env.NEXT_PUBLIC_WS_URL; + const mod = await import("@/store/socket"); expect(mod.WS_URL).toBe("ws://localhost:8080/ws"); }); it("derives WS_URL from NEXT_PUBLIC_PLATFORM_URL by replacing http→ws and appending /ws", async () => { - const mod = await importWsUrl({ - NEXT_PUBLIC_PLATFORM_URL: "http://api.example.com", - NEXT_PUBLIC_WS_URL: undefined, - }); + vi.resetModules(); + process.env.NEXT_PUBLIC_PLATFORM_URL = "http://api.example.com"; + delete process.env.NEXT_PUBLIC_WS_URL; + const mod = await import("@/store/socket"); expect(mod.WS_URL).toBe("ws://api.example.com/ws"); }); it("handles https→wss correctly", async () => { - const mod = await importWsUrl({ - NEXT_PUBLIC_PLATFORM_URL: "https://api.example.com", - NEXT_PUBLIC_WS_URL: undefined, - }); + vi.resetModules(); + process.env.NEXT_PUBLIC_PLATFORM_URL = "https://api.example.com"; + delete process.env.NEXT_PUBLIC_WS_URL; + const mod = await import("@/store/socket"); expect(mod.WS_URL).toBe("wss://api.example.com/ws"); }); it("NEXT_PUBLIC_WS_URL takes precedence over derived value", async () => { - const mod = await importWsUrl({ - NEXT_PUBLIC_PLATFORM_URL: "http://api.example.com", - NEXT_PUBLIC_WS_URL: "wss://ws.example.com/custom", - }); + vi.resetModules(); + process.env.NEXT_PUBLIC_PLATFORM_URL = "http://api.example.com"; + process.env.NEXT_PUBLIC_WS_URL = "wss://ws.example.com/custom"; + const mod = await import("@/store/socket"); expect(mod.WS_URL).toBe("wss://ws.example.com/custom"); }); @@ -67,8 +49,7 @@ describe("socket WS_URL derivation", () => { it("PLATFORM_URL in api.ts reads from NEXT_PUBLIC_PLATFORM_URL", async () => { vi.resetModules(); process.env.NEXT_PUBLIC_PLATFORM_URL = "http://prod.example.com"; - const apiMod = await import("@/lib/api"); - expect(apiMod.PLATFORM_URL).toBe("http://prod.example.com"); - delete process.env.NEXT_PUBLIC_PLATFORM_URL; + const mod = await import("@/lib/api"); + expect(mod.PLATFORM_URL).toBe("http://prod.example.com"); }); }); diff --git a/canvas/src/store/canvas-topology.ts b/canvas/src/store/canvas-topology.ts index 334dcff7..5c733626 100644 --- a/canvas/src/store/canvas-topology.ts +++ b/canvas/src/store/canvas-topology.ts @@ -34,7 +34,17 @@ export function sortParentsBeforeChildren