import { describe, expect, it } from "@effect/vitest"; import { type ApiKeyAuthMethod, type AuthPlacement, apiKeyMethodLabel, describeApiKeyAuthMethod, describeNoneAuthMethod, normalizeAuthMethodSlugs, oauthBearerPlacement, renderAuthPlacements, requiredPlacementVariables, } from "./auth-method"; describe("renderAuthPlacements", () => { it("renders a bearer header from the implicit token variable", () => { expect( renderAuthPlacements([{ carrier: "header", name: "Authorization", prefix: "Bearer " }], { token: "tok_1", }), ).toEqual({ headers: { Authorization: "Bearer tok_1" }, queryParams: {} }); }); it("renders a query param (the ui.sh '?token=' case)", () => { expect(renderAuthPlacements([{ carrier: "query", name: "token" }], { token: "tok_1" })).toEqual( { headers: {}, queryParams: { token: "tok_1" } }, ); }); it("mixes header and query placements in one method", () => { expect( renderAuthPlacements( [ { carrier: "header", name: "Authorization", prefix: "Bearer ", variable: "api_token" }, { carrier: "query", name: "team_id", variable: "team_id" }, ], { api_token: "tok_1", team_id: "team_9" }, ), ).toEqual({ headers: { Authorization: "Bearer tok_1" }, queryParams: { team_id: "team_9" }, }); }); it("renders distinct variables into their own placements (Datadog's two keys)", () => { expect( renderAuthPlacements( [ { carrier: "header", name: "DD-API-KEY", variable: "dd_api_key" }, { carrier: "header", name: "DD-APPLICATION-KEY", variable: "dd_application_key" }, ], { dd_api_key: "a", dd_application_key: "b" }, ), ).toEqual({ headers: { "DD-API-KEY": "a", "DD-APPLICATION-KEY": "b" }, queryParams: {}, }); }); it("lets two placements share one variable (same value in two spots)", () => { expect( renderAuthPlacements( [ { carrier: "header", name: "X-Token" }, { carrier: "query", name: "token" }, ], { token: "shared" }, ), ).toEqual({ headers: { "X-Token": "shared" }, queryParams: { token: "shared" } }); }); it("renders literal placements verbatim, with no credential", () => { expect( renderAuthPlacements( [ { carrier: "header", name: "X-Api-Version", literal: "2023-01-01" }, { carrier: "header", name: "Authorization", prefix: "Bearer " }, ], { token: "tok_1" }, ), ).toEqual({ headers: { "X-Api-Version": "2023-01-01", Authorization: "Bearer tok_1" }, queryParams: {}, }); }); it("skips a credential placement whose variable resolved to nothing", () => { expect( renderAuthPlacements( [ { carrier: "header", name: "Authorization", prefix: "Bearer " }, { carrier: "query", name: "team_id", variable: "team_id" }, ], { token: "tok_1", team_id: null }, ), ).toEqual({ headers: { Authorization: "Bearer tok_1" }, queryParams: {} }); }); it("renders nothing for an empty values map", () => { expect( renderAuthPlacements([{ carrier: "header", name: "Authorization", prefix: "Bearer " }], {}), ).toEqual({ headers: {}, queryParams: {} }); }); }); describe("requiredPlacementVariables", () => { it("dedupes shared variables and defaults absent ones to token", () => { const placements: readonly AuthPlacement[] = [ { carrier: "header", name: "X-Token" }, { carrier: "query", name: "token" }, { carrier: "query", name: "team_id", variable: "team_id" }, ]; expect(requiredPlacementVariables(placements)).toEqual(["token", "team_id"]); }); it("excludes literal placements (they reference no credential)", () => { expect( requiredPlacementVariables([ { carrier: "header", name: "X-Api-Version", literal: "2023-01-01" }, ]), ).toEqual([]); }); }); describe("oauthBearerPlacement", () => { it("defaults to the conventional Authorization: Bearer header", () => { expect(renderAuthPlacements([oauthBearerPlacement()], { token: "at_1" })).toEqual({ headers: { Authorization: "Bearer at_1" }, queryParams: {}, }); }); it("honors a custom header and prefix (graphql oauth override)", () => { expect( renderAuthPlacements([oauthBearerPlacement("X-Access-Token", "")], { token: "at_1" }), ).toEqual({ headers: { "X-Access-Token": "at_1" }, queryParams: {} }); }); }); describe("normalizeAuthMethodSlugs", () => { type Input = { readonly slug?: string | undefined; readonly kind: string }; const byKind = (method: Input) => method.kind; it("keeps caller-provided slugs and defaults the rest", () => { expect( normalizeAuthMethodSlugs( [{ slug: "custom_abc", kind: "apikey" }, { kind: "none" }], byKind, ).map((m) => m.slug), ).toEqual(["custom_abc", "none"]); }); it("suffixes collisions deterministically", () => { expect( normalizeAuthMethodSlugs( [{ kind: "apikey" }, { kind: "apikey" }, { slug: "apikey", kind: "apikey" }], byKind, ).map((m) => m.slug), ).toEqual(["apikey", "apikey_2", "apikey_3"]); }); it("treats a blank slug as absent", () => { expect(normalizeAuthMethodSlugs([{ slug: " ", kind: "oauth2" }], byKind)[0]?.slug).toBe( "oauth2", ); }); }); describe("catalog projection", () => { it("projects an apikey method with placements, deriving the label", () => { const method: ApiKeyAuthMethod = { slug: "header", kind: "apikey", placements: [{ carrier: "header", name: "X-Api-Key", prefix: "Bearer " }], }; expect(describeApiKeyAuthMethod(method)).toEqual({ id: "header", label: "API key (X-Api-Key)", kind: "apikey", template: "header", placements: [{ carrier: "header", name: "X-Api-Key", prefix: "Bearer " }], }); }); it("carries explicit variables and literals through to the descriptor", () => { const method: ApiKeyAuthMethod = { slug: "custom_x", kind: "apikey", label: "Token + team", placements: [ { carrier: "header", name: "Authorization", prefix: "Bearer ", variable: "api_token" }, { carrier: "query", name: "team_id", variable: "team_id" }, { carrier: "header", name: "X-Api-Version", literal: "2023-01-01" }, ], }; expect(describeApiKeyAuthMethod(method)).toEqual({ id: "custom_x", label: "Token + team", kind: "apikey", template: "custom_x", placements: [ { carrier: "header", name: "Authorization", prefix: "Bearer ", variable: "api_token" }, { carrier: "query", name: "team_id", prefix: "", variable: "team_id" }, { carrier: "header", name: "X-Api-Version", prefix: "", literal: "2023-01-01" }, ], }); }); it("falls back to the slug when no placement is named", () => { expect(apiKeyMethodLabel({ slug: "custom_y", kind: "apikey", placements: [] })).toBe( "API key (custom_y)", ); }); it("projects a none method", () => { expect(describeNoneAuthMethod("none")).toEqual({ id: "none", label: "No authentication", kind: "none", template: "none", }); }); });