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(); });});
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();
});
});