49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import { afterEach, describe, expect, test } from "bun:test";
|
|
|
|
import { createDenClient, DenApiError } from "../src/app/lib/den";
|
|
|
|
const originalFetch = globalThis.fetch;
|
|
|
|
afterEach(() => {
|
|
Object.defineProperty(globalThis, "fetch", {
|
|
configurable: true,
|
|
value: originalFetch,
|
|
});
|
|
});
|
|
|
|
describe("published desktop MCP connect compatibility", () => {
|
|
test("surfaces an issuer-review conflict as an actionable Den error", async () => {
|
|
const message = "This connection's OAuth issuer changed and existing credentials must be cleared. Ask a workspace admin to reconnect it.";
|
|
Object.defineProperty(globalThis, "fetch", {
|
|
configurable: true,
|
|
value: async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
expect(String(input)).toBe("https://api.den.example.test/v1/mcp-connections/connection_1/connect/start");
|
|
expect(init?.method).toBe("GET");
|
|
return Response.json({
|
|
error: "mcp_oauth_issuer_mismatch",
|
|
message,
|
|
}, { status: 409 });
|
|
},
|
|
});
|
|
|
|
const client = createDenClient({
|
|
baseUrl: "https://den.example.test",
|
|
apiBaseUrl: "https://api.den.example.test",
|
|
token: "published-desktop-token",
|
|
});
|
|
|
|
let failure: unknown;
|
|
try {
|
|
await client.startMcpConnectionConnect("org_1", "connection_1");
|
|
} catch (error) {
|
|
failure = error;
|
|
}
|
|
|
|
expect(failure).toBeInstanceOf(DenApiError);
|
|
if (!(failure instanceof DenApiError)) throw new Error("Expected a structured Den API error.");
|
|
expect(failure.status).toBe(409);
|
|
expect(failure.code).toBe("mcp_oauth_issuer_mismatch");
|
|
expect(failure.message).toBe(message);
|
|
});
|
|
});
|