122 lines · 3.9 KB · TypeScript
RawDownload
import { describe, expect, it } from "@effect/vitest";import type { IntegrationPlugin } from "@executor-js/sdk/client"; import {  availableCatalogKinds,  filterCatalogEntries,  parseCatalogSearch,  pickConnectTarget,  presetDomains,} from "./integrations-sh-catalog"; const plugin = (key: string, presets: IntegrationPlugin["presets"]): IntegrationPlugin => ({  key,  label: key,  add: () => null,  presets,}); describe("parseCatalogSearch", () => {  it("keeps connectable kinds and drops CLI-only entries", () => {    const entries = parseCatalogSearch({      results: [        { domain: "linear.app", description: "Issues", kinds: ["mcp", "cli"] },        { domain: "cli-only.dev", description: "A CLI", kinds: ["cli"] },      ],    });    expect(entries).toEqual([{ domain: "linear.app", description: "Issues", kinds: ["mcp"] }]);  });   it("returns nothing for a malformed payload", () => {    expect(parseCatalogSearch({ nope: true })).toEqual([]);    expect(parseCatalogSearch(undefined)).toEqual([]);  });}); describe("pickConnectTarget", () => {  const payload = {    surfaces: [      { type: "graphql", url: "https://api.linear.app/graphql", slug: "linear-graphql-api" },      { type: "mcp", url: "https://mcp.linear.app/mcp", slug: "linear" },      { type: "http", spec: "https://example.com/openapi.json", slug: "example-rest" },      { type: "cli", slug: "linear-cli" },    ],  };   it("resolves the MCP endpoint for the mcp kind", () => {    expect(pickConnectTarget(payload, "mcp")).toEqual({      kind: "mcp",      url: "https://mcp.linear.app/mcp",      slug: "linear",    });  });   it("resolves the spec URL (not the base URL) for the openapi kind", () => {    expect(pickConnectTarget(payload, "openapi")).toEqual({      kind: "openapi",      url: "https://example.com/openapi.json",      slug: "example-rest",    });  });   it("resolves the GraphQL endpoint for the graphql kind", () => {    expect(pickConnectTarget(payload, "graphql")).toEqual({      kind: "graphql",      url: "https://api.linear.app/graphql",      slug: "linear-graphql-api",    });  });   it("skips specless http surfaces for the openapi kind", () => {    const specless = { surfaces: [{ type: "http", url: "https://api.example.com" }] };    expect(pickConnectTarget(specless, "openapi")).toBeUndefined();  });   it("returns undefined for a malformed document", () => {    expect(pickConnectTarget({ surfaces: "nope" }, "mcp")).toBeUndefined();  });}); describe("preset filtering", () => {  const plugins: IntegrationPlugin[] = [    plugin("mcp", [      {        id: "linear",        name: "Linear",        summary: "Issues",        icon: "https://integrations.sh/logo/linear.app",      },    ]),    plugin("openapi", [      {        id: "stripe",        name: "Stripe",        summary: "Payments",        url: "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json",        icon: "https://integrations.sh/logo/stripe.com",      },    ]),  ];   it("derives preset domains from logo-proxy icons and preset URLs", () => {    const domains = presetDomains(plugins);    expect(domains.has("linear.app")).toBe(true);    expect(domains.has("stripe.com")).toBe(true);  });   it("lists only kinds a loaded plugin can add", () => {    expect(availableCatalogKinds(plugins)).toEqual(["mcp", "openapi"]);  });   it("hides preset-covered domains and unaddable kinds", () => {    const entries = filterCatalogEntries(      [        { domain: "linear.app", description: "Issues", kinds: ["mcp"] },        { domain: "shopify.dev", description: "Commerce", kinds: ["graphql"] },        { domain: "notion.com", description: "Notes", kinds: ["mcp", "graphql"] },      ],      { excludeDomains: presetDomains(plugins), availableKinds: availableCatalogKinds(plugins) },    );    expect(entries).toEqual([{ domain: "notion.com", description: "Notes", kinds: ["mcp"] }]);  });});