import { describe, expect, it } from "@effect/vitest"; import { renderAuthTemplate } from "./config"; import { migrateOpenApiAuthConfig } from "./migrate-config"; import type { Authentication } from "./types"; // --------------------------------------------------------------------------- // The one-off config migration rewrites the retired `variable()`-templated // apiKey shape into canonical placements. Slugs and variable names are // preserved verbatim (`connection.template` / `item_ids` contracts), and the // EQUIVALENCE tests pin that a migrated template renders byte-identically to // what the legacy renderer produced for the same values. // --------------------------------------------------------------------------- const BASE = { spec: "{}", baseUrl: "https://api.example.com" } as const; describe("migrateOpenApiAuthConfig", () => { it("rewrites a single-input bearer template (prefix + token)", () => { const migrated = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [ { slug: "bearer", type: "apiKey", headers: { Authorization: ["Bearer ", { type: "variable", name: "token" }] }, }, ], }); expect(migrated).toEqual({ ...BASE, authenticationTemplate: [ { slug: "bearer", kind: "apikey", placements: [{ carrier: "header", name: "Authorization", prefix: "Bearer " }], }, ], }); }); it("rewrites a multi-input template (Datadog), variables preserved verbatim", () => { const migrated = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [ { slug: "datadog", type: "apiKey", headers: { "DD-API-KEY": [{ type: "variable", name: "dd_api_key" }], "DD-APPLICATION-KEY": [{ type: "variable", name: "dd_application_key" }], }, queryParams: { site: [{ type: "variable", name: "site" }] }, }, ], }); expect(migrated).toEqual({ ...BASE, authenticationTemplate: [ { slug: "datadog", kind: "apikey", placements: [ { carrier: "header", name: "DD-API-KEY", variable: "dd_api_key" }, { carrier: "header", name: "DD-APPLICATION-KEY", variable: "dd_application_key" }, { carrier: "query", name: "site", variable: "site" }, ], }, ], }); }); it("rewrites literal-only template values into literal placements", () => { const migrated = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [ { slug: "versioned", type: "apiKey", headers: { "X-Api-Version": "2023-01-01", Authorization: ["Bearer ", { type: "variable", name: "token" }], }, }, ], }) as { authenticationTemplate: readonly unknown[] }; expect(migrated.authenticationTemplate[0]).toEqual({ slug: "versioned", kind: "apikey", placements: [ { carrier: "header", name: "X-Api-Version", literal: "2023-01-01" }, { carrier: "header", name: "Authorization", prefix: "Bearer " }, ], }); }); it('re-keys the retired `type: "oauth"` spelling to `kind: "oauth2"`', () => { const migrated = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [ { slug: "oauth", type: "oauth", authorizationUrl: "https://x.example/auth", tokenUrl: "https://x.example/token", scopes: ["read"], }, { slug: "key", type: "apiKey", queryParams: { key: [{ type: "variable", name: "token" }] }, }, ], }) as { authenticationTemplate: readonly unknown[] }; expect(migrated.authenticationTemplate[0]).toEqual({ slug: "oauth", kind: "oauth2", authorizationUrl: "https://x.example/auth", tokenUrl: "https://x.example/token", scopes: ["read"], }); }); it("is idempotent — canonical configs return null", () => { const canonical = { ...BASE, authenticationTemplate: [ { slug: "bearer", kind: "apikey", placements: [{ carrier: "header", name: "Authorization", prefix: "Bearer " }], }, ], }; expect(migrateOpenApiAuthConfig(canonical)).toBeNull(); const lifted = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [ { slug: "b", type: "apiKey", headers: { A: [{ type: "variable", name: "token" }] } }, ], }); expect(migrateOpenApiAuthConfig(lifted)).toBeNull(); }); it("leaves template-less, foreign, and unmigratable blobs untouched", () => { expect(migrateOpenApiAuthConfig({ ...BASE })).toBeNull(); expect(migrateOpenApiAuthConfig({ transport: "remote", endpoint: "x" })).toBeNull(); expect(migrateOpenApiAuthConfig(null)).toBeNull(); expect( migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [{ garbage: true }] }), ).toBeNull(); }); }); // --------------------------------------------------------------------------- // Equivalence — the migrated template renders EXACTLY what the legacy // renderer produced. Expected outputs below are the legacy renderer's // behavior, written out by hand so the old code can stay deleted. // --------------------------------------------------------------------------- describe("legacy render equivalence", () => { const migrateTemplate = (legacy: unknown): Authentication => { const migrated = migrateOpenApiAuthConfig({ ...BASE, authenticationTemplate: [legacy], }) as { authenticationTemplate: readonly Authentication[] }; return migrated.authenticationTemplate[0]!; }; it("bearer header (prefix + token)", () => { const template = migrateTemplate({ slug: "bearer", type: "apiKey", headers: { Authorization: ["Bearer ", { type: "variable", name: "token" }] }, }); expect(renderAuthTemplate(template, { token: "tok_1" })).toEqual({ headers: { Authorization: "Bearer tok_1" }, queryParams: {}, }); }); it("two distinct inputs across headers and query (Datadog-style)", () => { const template = migrateTemplate({ slug: "datadog", type: "apiKey", headers: { "DD-API-KEY": [{ type: "variable", name: "dd_api_key" }], "DD-APPLICATION-KEY": [{ type: "variable", name: "dd_application_key" }], }, queryParams: { team: [{ type: "variable", name: "team" }] }, }); expect( renderAuthTemplate(template, { dd_api_key: "a", dd_application_key: "b", team: "t" }), ).toEqual({ headers: { "DD-API-KEY": "a", "DD-APPLICATION-KEY": "b" }, queryParams: { team: "t" }, }); }); it("literal-only value renders verbatim with no credential", () => { const template = migrateTemplate({ slug: "versioned", type: "apiKey", headers: { "X-Api-Version": "2023-01-01", Authorization: ["Bearer ", { type: "variable", name: "token" }], }, }); expect(renderAuthTemplate(template, { token: "tok_1" })).toEqual({ headers: { "X-Api-Version": "2023-01-01", Authorization: "Bearer tok_1" }, queryParams: {}, }); }); it("bare query token (no prefix)", () => { const template = migrateTemplate({ slug: "key", type: "apiKey", queryParams: { api_key: [{ type: "variable", name: "token" }] }, }); expect(renderAuthTemplate(template, { token: "k1" })).toEqual({ headers: {}, queryParams: { api_key: "k1" }, }); }); });