import { EnvironmentId } from "@t3tools/contracts"; import { beforeEach, describe, expect, it, vi } from "vitest"; const mockResolveRemotePairingTarget = vi.fn(); const mockFetchRemoteEnvironmentDescriptor = vi.fn(); const mockBootstrapRemoteBearerSession = vi.fn(); const mockPersistSavedEnvironmentRecord = vi.fn(); const mockWriteSavedEnvironmentBearerToken = vi.fn(); const mockSetSavedEnvironmentRegistry = vi.fn(); const mockUpsert = vi.fn(); const mockListSavedEnvironmentRecords = vi.fn(); vi.mock("../remote/target", () => ({ resolveRemotePairingTarget: mockResolveRemotePairingTarget, })); vi.mock("../remote/api", () => ({ bootstrapRemoteBearerSession: mockBootstrapRemoteBearerSession, fetchRemoteEnvironmentDescriptor: mockFetchRemoteEnvironmentDescriptor, fetchRemoteSessionState: vi.fn(), resolveRemoteWebSocketConnectionUrl: vi.fn(), })); vi.mock("~/localApi", () => ({ ensureLocalApi: () => ({ persistence: { setSavedEnvironmentRegistry: mockSetSavedEnvironmentRegistry, }, }), })); vi.mock("./catalog", () => ({ getSavedEnvironmentRecord: vi.fn(), hasSavedEnvironmentRegistryHydrated: vi.fn(), listSavedEnvironmentRecords: mockListSavedEnvironmentRecords, persistSavedEnvironmentRecord: mockPersistSavedEnvironmentRecord, readSavedEnvironmentBearerToken: vi.fn(), removeSavedEnvironmentBearerToken: vi.fn(), useSavedEnvironmentRegistryStore: { getState: () => ({ upsert: mockUpsert, remove: vi.fn(), markConnected: vi.fn(), }), }, useSavedEnvironmentRuntimeStore: { getState: () => ({ ensure: vi.fn(), patch: vi.fn(), clear: vi.fn(), }), }, waitForSavedEnvironmentRegistryHydration: vi.fn(), writeSavedEnvironmentBearerToken: mockWriteSavedEnvironmentBearerToken, })); vi.mock("./connection", () => ({ createEnvironmentConnection: vi.fn(), })); describe("addSavedEnvironment", () => { beforeEach(() => { vi.resetModules(); vi.clearAllMocks(); mockResolveRemotePairingTarget.mockReturnValue({ httpBaseUrl: "https://remote.example.com/", wsBaseUrl: "wss://remote.example.com/", credential: "pairing-code", }); mockFetchRemoteEnvironmentDescriptor.mockResolvedValue({ environmentId: EnvironmentId.makeUnsafe("environment-1"), label: "Remote environment", }); mockBootstrapRemoteBearerSession.mockResolvedValue({ sessionToken: "bearer-token", role: "owner", }); mockPersistSavedEnvironmentRecord.mockResolvedValue(undefined); mockWriteSavedEnvironmentBearerToken.mockResolvedValue(false); mockSetSavedEnvironmentRegistry.mockResolvedValue(undefined); mockListSavedEnvironmentRecords.mockReturnValue([]); }); it("rolls back persisted metadata when bearer token persistence fails", async () => { const { addSavedEnvironment, resetEnvironmentServiceForTests } = await import("./service"); await expect( addSavedEnvironment({ label: "Remote environment", host: "remote.example.com", pairingCode: "123456", }), ).rejects.toThrow("Unable to persist saved environment credentials."); expect(mockPersistSavedEnvironmentRecord).toHaveBeenCalledTimes(1); expect(mockWriteSavedEnvironmentBearerToken).toHaveBeenCalledWith( EnvironmentId.makeUnsafe("environment-1"), "bearer-token", ); expect(mockSetSavedEnvironmentRegistry).toHaveBeenCalledWith([]); expect(mockUpsert).not.toHaveBeenCalled(); await resetEnvironmentServiceForTests(); }); });