113 lines · 3.9 KB · TypeScript
RawDownload
import { describe, expect, it } from "@effect/vitest";import {  ConnectionAddress,  ConnectionName,  AuthTemplateSlug,  IntegrationSlug,  OAuthClientSlug,  ProviderKey,  type Connection,  type OAuthClientSummary,  type Owner,} from "@executor-js/sdk/shared"; import { buildUsageMap, connectionsUsingClient } from "./oauth-client-usage"; // Minimal app summary builder — only the fields the helpers read matter.const app = (slug: string, opts?: { readonly owner?: Owner }): OAuthClientSummary => ({  owner: opts?.owner ?? "org",  slug: OAuthClientSlug.make(slug),  grant: "authorization_code",  authorizationUrl: "https://issuer.example.com/authorize",  tokenUrl: "https://issuer.example.com/token",  resource: null,  clientId: "client-id",  origin: { kind: "manual" },}); // A connection optionally minted by an app (its `oauthClient` slug).const connection = (  integration: string,  name: string,  opts?: {    readonly owner?: Owner;    readonly oauthClient?: string | null;    readonly oauthClientOwner?: Owner | null;  },): Connection => ({  owner: opts?.owner ?? "user",  name: ConnectionName.make(name),  integration: IntegrationSlug.make(integration),  template: AuthTemplateSlug.make("oauth"),  provider: ProviderKey.make("default"),  address: ConnectionAddress.make(`tools.${integration}.user.${name}`),  identityLabel: null,  expiresAt: null,  oauthClient:    opts?.oauthClient === undefined      ? null      : opts.oauthClient === null        ? null        : OAuthClientSlug.make(opts.oauthClient),  oauthClientOwner: opts?.oauthClientOwner ?? null,}); describe("buildUsageMap / connectionsUsingClient", () => {  it("maps connections to the app slug that minted them", () => {    const usage = buildUsageMap([      connection("github", "personal", { oauthClient: "gh-app", oauthClientOwner: "org" }),      connection("github", "bot", { oauthClient: "gh-app", oauthClientOwner: "org" }),      connection("linear", "main", { oauthClient: "linear-app", oauthClientOwner: "org" }),    ]);    expect(      connectionsUsingClient(usage, app("gh-app", { owner: "org" })).map((c: Connection) =>        String(c.name),      ),    ).toEqual(["personal", "bot"]);    expect(      connectionsUsingClient(usage, app("linear-app", { owner: "org" })).map((c: Connection) =>        String(c.name),      ),    ).toEqual(["main"]);  });   it("keys usage by app owner as well as slug", () => {    const usage = buildUsageMap([      connection("github", "workspace", { oauthClient: "github", oauthClientOwner: "org" }),      connection("github", "personal", { oauthClient: "github", oauthClientOwner: "user" }),    ]);    expect(      connectionsUsingClient(usage, app("github", { owner: "org" })).map((c: Connection) =>        String(c.name),      ),    ).toEqual(["workspace"]);    expect(      connectionsUsingClient(usage, app("github", { owner: "user" })).map((c: Connection) =>        String(c.name),      ),    ).toEqual(["personal"]);  });   it("skips static connections with a null oauthClient", () => {    const usage = buildUsageMap([      connection("vercel", "static", { oauthClient: null }),      connection("github", "oauth", { oauthClient: "gh-app", oauthClientOwner: "org" }),    ]);    expect(usage.size).toBe(1);    // Only the OAuth-minted connection is tracked; the static one is absent.    expect(connectionsUsingClient(usage, app("gh-app", { owner: "org" }))).toHaveLength(1);  });   it("returns an empty array for an app that backs no connections", () => {    const usage = buildUsageMap([      connection("github", "oauth", { oauthClient: "gh-app", oauthClientOwner: "org" }),    ]);    expect(connectionsUsingClient(usage, app("unused-app", { owner: "org" }))).toEqual([]);  });   it("returns an empty map when there are no connections", () => {    const usage = buildUsageMap([]);    expect(usage.size).toBe(0);    expect(connectionsUsingClient(usage, app("any", { owner: "org" }))).toEqual([]);  });});