73 lines
2.4 KiB
TypeScript
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();
|
|
});
|
|
});
|