import { describe, expect, it } from "@effect/vitest";import type { AuthTemplateEditorValue } from "@executor-js/react/components/auth-template-editor"; import { mcpAuthTemplateFromEditorValue } from "./auth-method-config"; describe("mcpAuthTemplateFromEditorValue", () => { it("maps 'none' → { kind: 'none' }", () => { expect(mcpAuthTemplateFromEditorValue({ kind: "none" })).toEqual({ kind: "none" }); }); it("maps 'oauth' → { kind: 'oauth2' } (endpoints are resolved at connect time)", () => { const value: AuthTemplateEditorValue = { kind: "oauth", authorizationUrl: "https://a.example.com/auth", tokenUrl: "https://a.example.com/token", scopes: ["mcp.read"], }; expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "oauth2" }); }); it("maps apiKey → a header template from the first named header placement (with prefix)", () => { const value: AuthTemplateEditorValue = { kind: "apikey", placements: [{ carrier: "header", name: "Authorization", prefix: "Bearer " }], }; expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "header", headerName: "Authorization", prefix: "Bearer ", }); }); it("omits the prefix when blank", () => { const value: AuthTemplateEditorValue = { kind: "apikey", placements: [{ carrier: "header", name: "X-Token", prefix: "" }], }; expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "header", headerName: "X-Token", }); }); it("skips a query placement (MCP carries a single header) and falls back to none", () => { const value: AuthTemplateEditorValue = { kind: "apikey", placements: [{ carrier: "query", name: "api_key", prefix: "" }], }; expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "none" }); }); it("uses the first NAMED header placement (skips unnamed)", () => { const value: AuthTemplateEditorValue = { kind: "apikey", placements: [ { carrier: "header", name: "", prefix: "" }, { carrier: "header", name: "X-Token", prefix: "" }, ], }; expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "header", headerName: "X-Token", }); });});
import { describe, expect, it } from "@effect/vitest";
import type { AuthTemplateEditorValue } from "@executor-js/react/components/auth-template-editor";
import { mcpAuthTemplateFromEditorValue } from "./auth-method-config";
describe("mcpAuthTemplateFromEditorValue", () => {
it("maps 'none' → { kind: 'none' }", () => {
expect(mcpAuthTemplateFromEditorValue({ kind: "none" })).toEqual({ kind: "none" });
});
it("maps 'oauth' → { kind: 'oauth2' } (endpoints are resolved at connect time)", () => {
const value: AuthTemplateEditorValue = {
kind: "oauth",
authorizationUrl: "https://a.example.com/auth",
tokenUrl: "https://a.example.com/token",
scopes: ["mcp.read"],
};
expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "oauth2" });
});
it("maps apiKey → a header template from the first named header placement (with prefix)", () => {
const value: AuthTemplateEditorValue = {
kind: "apikey",
placements: [{ carrier: "header", name: "Authorization", prefix: "Bearer " }],
};
expect(mcpAuthTemplateFromEditorValue(value)).toEqual({
kind: "header",
headerName: "Authorization",
prefix: "Bearer ",
});
});
it("omits the prefix when blank", () => {
const value: AuthTemplateEditorValue = {
kind: "apikey",
placements: [{ carrier: "header", name: "X-Token", prefix: "" }],
};
expect(mcpAuthTemplateFromEditorValue(value)).toEqual({
kind: "header",
headerName: "X-Token",
});
});
it("skips a query placement (MCP carries a single header) and falls back to none", () => {
const value: AuthTemplateEditorValue = {
kind: "apikey",
placements: [{ carrier: "query", name: "api_key", prefix: "" }],
};
expect(mcpAuthTemplateFromEditorValue(value)).toEqual({ kind: "none" });
});
it("uses the first NAMED header placement (skips unnamed)", () => {
const value: AuthTemplateEditorValue = {
kind: "apikey",
placements: [
{ carrier: "header", name: "", prefix: "" },
{ carrier: "header", name: "X-Token", prefix: "" },
],
};
expect(mcpAuthTemplateFromEditorValue(value)).toEqual({
kind: "header",
headerName: "X-Token",
});
});
});