Files
openwork/apps/app/tests/mcp-local-server-recovery.test.ts

73 lines
2.4 KiB
TypeScript

import { afterEach, describe, expect, test } from "bun:test";
import type { McpDirectoryInfo } from "../src/app/constants";
import { submitMcpEntry } from "../src/react-app/domains/connections/modals/add-mcp-submission";
import type { OpenworkServerStore } from "../src/react-app/domains/connections/openwork-server-store";
import { createConnectionsStore } from "../src/react-app/domains/connections/store";
const originalWindow = globalThis.window;
function installDesktopWindow() {
Object.defineProperty(globalThis, "window", {
configurable: true,
value: { __OPENWORK_ELECTRON__: {} },
});
}
afterEach(() => {
Object.defineProperty(globalThis, "window", {
configurable: true,
value: originalWindow,
});
});
describe("local MCP server recovery", () => {
test("returns submission feedback when local server recovery never settles", async () => {
installDesktopWindow();
let recoveryAttempts = 0;
const stalledRecovery = new Promise<never>(() => undefined);
const openworkServer = {
getSnapshot: () => ({
openworkServerStatus: "disconnected",
openworkServerClient: null,
openworkServerCapabilities: null,
}),
ensureLocalOpenworkServerClient: () => {
recoveryAttempts += 1;
return stalledRecovery;
},
} as unknown as OpenworkServerStore;
const store = createConnectionsStore({
client: () => null,
setClient: () => undefined,
projectDir: () => "/tmp/openwork-mcp-recovery",
selectedWorkspaceId: () => "workspace_local",
selectedWorkspaceRoot: () => "/tmp/openwork-mcp-recovery",
workspaceType: () => "local",
openworkServer,
runtimeWorkspaceId: () => null,
ensureRuntimeWorkspaceId: async () => "workspace_local",
localOpenworkServerRecoveryTimeoutMs: 10,
developerMode: () => false,
});
const entry: McpDirectoryInfo = {
name: "Stalled recovery",
description: "",
type: "remote",
url: "https://example.com/mcp",
oauth: true,
managedOAuth: true,
};
const result = await Promise.race([
submitMcpEntry(store.connectMcp, entry, "Fallback error"),
new Promise<"still pending">((resolve) => setTimeout(() => resolve("still pending"), 250)),
]);
expect(recoveryAttempts).toBe(1);
expect(result).not.toBe("still pending");
expect(result).not.toBeNull();
expect(store.getSnapshot().mcpConnectingName).toBeNull();
});
});