import { EnvironmentId, type LocalApi, type PersistedSavedEnvironmentRecord,} from "@t3tools/contracts";import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test"; import { resetSavedEnvironmentRegistryStoreForTests, resetSavedEnvironmentRuntimeStoreForTests, useSavedEnvironmentRegistryStore, useSavedEnvironmentRuntimeStore, waitForSavedEnvironmentRegistryHydration,} from "./catalog"; describe("environment runtime catalog stores", () => { beforeEach(async () => { vi.stubGlobal("window", { nativeApi: { persistence: { getClientSettings: async () => null, setClientSettings: async () => undefined, getSavedEnvironmentRegistry: async () => [], setSavedEnvironmentRegistry: async () => undefined, getSavedEnvironmentSecret: async () => null, setSavedEnvironmentSecret: async () => true, removeSavedEnvironmentSecret: async () => undefined, }, } satisfies Pick<LocalApi, "persistence">, }); const { __resetLocalApiForTests } = await import("../../localApi"); await __resetLocalApiForTests(); }); afterEach(async () => { resetSavedEnvironmentRegistryStoreForTests(); resetSavedEnvironmentRuntimeStoreForTests(); const { __resetLocalApiForTests } = await import("../../localApi"); await __resetLocalApiForTests(); vi.unstubAllGlobals(); }); it("resets the saved environment registry store state", () => { const environmentId = EnvironmentId.make("environment-1"); useSavedEnvironmentRegistryStore.getState().upsert({ environmentId, label: "Remote environment", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", createdAt: "2026-04-09T00:00:00.000Z", lastConnectedAt: null, }); expect(useSavedEnvironmentRegistryStore.getState().byId[environmentId]).toBeDefined(); resetSavedEnvironmentRegistryStoreForTests(); expect(useSavedEnvironmentRegistryStore.getState().byId).toEqual({}); }); it("resets the saved environment runtime store state", () => { const environmentId = EnvironmentId.make("environment-1"); useSavedEnvironmentRuntimeStore.getState().patch(environmentId, { connectionState: "connected", connectedAt: "2026-04-09T00:00:00.000Z", }); expect(useSavedEnvironmentRuntimeStore.getState().byId[environmentId]).toBeDefined(); resetSavedEnvironmentRuntimeStoreForTests(); expect(useSavedEnvironmentRuntimeStore.getState().byId).toEqual({}); }); it("does not throw when local api lookup fails during registry persistence", async () => { vi.unstubAllGlobals(); const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); const { __resetLocalApiForTests } = await import("../../localApi"); await __resetLocalApiForTests(); expect(() => useSavedEnvironmentRegistryStore.getState().upsert({ environmentId: EnvironmentId.make("environment-1"), label: "Remote environment", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", createdAt: "2026-04-09T00:00:00.000Z", lastConnectedAt: null, }), ).not.toThrow(); expect(errorSpy).toHaveBeenCalledWith("[SAVED_ENVIRONMENTS] persist failed", expect.any(Error)); }); it("does not let stale hydration overwrite records added while hydration is in flight", async () => { let resolveRegistryRead: () => void = () => { throw new Error("Registry read resolver was not initialized."); }; vi.stubGlobal("window", { nativeApi: { persistence: { getClientSettings: async () => null, setClientSettings: async () => undefined, getSavedEnvironmentRegistry: () => new Promise<readonly PersistedSavedEnvironmentRecord[]>((resolve) => { resolveRegistryRead = () => resolve([]); }), setSavedEnvironmentRegistry: async () => undefined, getSavedEnvironmentSecret: async () => null, setSavedEnvironmentSecret: async () => true, removeSavedEnvironmentSecret: async () => undefined, }, } satisfies Pick<LocalApi, "persistence">, }); const { __resetLocalApiForTests } = await import("../../localApi"); await __resetLocalApiForTests(); const hydrationPromise = waitForSavedEnvironmentRegistryHydration(); const environmentId = EnvironmentId.make("environment-1"); const record = { environmentId, label: "Remote environment", httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", createdAt: "2026-04-09T00:00:00.000Z", lastConnectedAt: null, } as const; useSavedEnvironmentRegistryStore.getState().upsert(record); resolveRegistryRead(); await hydrationPromise; expect(useSavedEnvironmentRegistryStore.getState().byId[environmentId]).toEqual(record); });});
import {
EnvironmentId,
type LocalApi,
type PersistedSavedEnvironmentRecord,
} from "@t3tools/contracts";
import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
import {
resetSavedEnvironmentRegistryStoreForTests,
resetSavedEnvironmentRuntimeStoreForTests,
useSavedEnvironmentRegistryStore,
useSavedEnvironmentRuntimeStore,
waitForSavedEnvironmentRegistryHydration,
} from "./catalog";
describe("environment runtime catalog stores", () => {
beforeEach(async () => {
vi.stubGlobal("window", {
nativeApi: {
persistence: {
getClientSettings: async () => null,
setClientSettings: async () => undefined,
getSavedEnvironmentRegistry: async () => [],
setSavedEnvironmentRegistry: async () => undefined,
getSavedEnvironmentSecret: async () => null,
setSavedEnvironmentSecret: async () => true,
removeSavedEnvironmentSecret: async () => undefined,
},
} satisfies Pick<LocalApi, "persistence">,
});
const { __resetLocalApiForTests } = await import("../../localApi");
await __resetLocalApiForTests();
});
afterEach(async () => {
resetSavedEnvironmentRegistryStoreForTests();
resetSavedEnvironmentRuntimeStoreForTests();
const { __resetLocalApiForTests } = await import("../../localApi");
await __resetLocalApiForTests();
vi.unstubAllGlobals();
});
it("resets the saved environment registry store state", () => {
const environmentId = EnvironmentId.make("environment-1");
useSavedEnvironmentRegistryStore.getState().upsert({
environmentId,
label: "Remote environment",
httpBaseUrl: "https://remote.example.com/",
wsBaseUrl: "wss://remote.example.com/",
createdAt: "2026-04-09T00:00:00.000Z",
lastConnectedAt: null,
});
expect(useSavedEnvironmentRegistryStore.getState().byId[environmentId]).toBeDefined();
resetSavedEnvironmentRegistryStoreForTests();
expect(useSavedEnvironmentRegistryStore.getState().byId).toEqual({});
});
it("resets the saved environment runtime store state", () => {
const environmentId = EnvironmentId.make("environment-1");
useSavedEnvironmentRuntimeStore.getState().patch(environmentId, {
connectionState: "connected",
connectedAt: "2026-04-09T00:00:00.000Z",
});
expect(useSavedEnvironmentRuntimeStore.getState().byId[environmentId]).toBeDefined();
resetSavedEnvironmentRuntimeStoreForTests();
expect(useSavedEnvironmentRuntimeStore.getState().byId).toEqual({});
});
it("does not throw when local api lookup fails during registry persistence", async () => {
vi.unstubAllGlobals();
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
const { __resetLocalApiForTests } = await import("../../localApi");
await __resetLocalApiForTests();
expect(() =>
useSavedEnvironmentRegistryStore.getState().upsert({
environmentId: EnvironmentId.make("environment-1"),
label: "Remote environment",
httpBaseUrl: "https://remote.example.com/",
wsBaseUrl: "wss://remote.example.com/",
createdAt: "2026-04-09T00:00:00.000Z",
lastConnectedAt: null,
}),
).not.toThrow();
expect(errorSpy).toHaveBeenCalledWith("[SAVED_ENVIRONMENTS] persist failed", expect.any(Error));
});
it("does not let stale hydration overwrite records added while hydration is in flight", async () => {
let resolveRegistryRead: () => void = () => {
throw new Error("Registry read resolver was not initialized.");
};
vi.stubGlobal("window", {
nativeApi: {
persistence: {
getClientSettings: async () => null,
setClientSettings: async () => undefined,
getSavedEnvironmentRegistry: () =>
new Promise<readonly PersistedSavedEnvironmentRecord[]>((resolve) => {
resolveRegistryRead = () => resolve([]);
}),
setSavedEnvironmentRegistry: async () => undefined,
getSavedEnvironmentSecret: async () => null,
setSavedEnvironmentSecret: async () => true,
removeSavedEnvironmentSecret: async () => undefined,
},
} satisfies Pick<LocalApi, "persistence">,
});
const { __resetLocalApiForTests } = await import("../../localApi");
await __resetLocalApiForTests();
const hydrationPromise = waitForSavedEnvironmentRegistryHydration();
const environmentId = EnvironmentId.make("environment-1");
const record = {
environmentId,
label: "Remote environment",
httpBaseUrl: "https://remote.example.com/",
wsBaseUrl: "wss://remote.example.com/",
createdAt: "2026-04-09T00:00:00.000Z",
lastConnectedAt: null,
} as const;
useSavedEnvironmentRegistryStore.getState().upsert(record);
resolveRegistryRead();
await hydrationPromise;
expect(useSavedEnvironmentRegistryStore.getState().byId[environmentId]).toEqual(record);
});
});