// ---------------------------------------------------------------------------// The row -> wire conversion behind the request-headers editor. What matters// is that a half-typed row never reaches the transport and that a pasted// token still works, so both are pinned here.// --------------------------------------------------------------------------- import { describe, expect, it } from "@effect/vitest"; import { emptyHeaderRow, isValidHeaderName, mcpHeadersFromRows } from "./request-headers"; describe("mcpHeadersFromRows", () => { it("returns undefined when nothing is configured", () => { expect(mcpHeadersFromRows([])).toBeUndefined(); expect(mcpHeadersFromRows([emptyHeaderRow()])).toBeUndefined(); }); it("builds the wire map from completed rows", () => { expect( mcpHeadersFromRows([ { name: "CF-Access-Client-Id", value: "client-id" }, { name: "CF-Access-Client-Secret", value: "client-secret" }, ]), ).toEqual({ "CF-Access-Client-Id": "client-id", "CF-Access-Client-Secret": "client-secret", }); }); it("drops a row the user has not finished naming", () => { expect( mcpHeadersFromRows([ { name: "X-Api-Key", value: "k" }, { name: " ", value: "orphaned" }, ]), ).toEqual({ "X-Api-Key": "k" }); }); it("trims surrounding whitespace off a pasted token", () => { expect(mcpHeadersFromRows([{ name: " X-Token ", value: " abc123\n" }])).toEqual({ "X-Token": "abc123", }); }); it("drops a name that cannot be put on the wire", () => { expect( mcpHeadersFromRows([ { name: "Bad Header", value: "v" }, { name: "Also:Bad", value: "v" }, { name: "Good-Header", value: "v" }, ]), ).toEqual({ "Good-Header": "v" }); }); it("keeps a header whose value is deliberately empty", () => { expect(mcpHeadersFromRows([{ name: "X-Empty", value: "" }])).toEqual({ "X-Empty": "" }); }); it("lets a later row win a duplicated name", () => { expect( mcpHeadersFromRows([ { name: "X-Token", value: "old" }, { name: "X-Token", value: "new" }, ]), ).toEqual({ "X-Token": "new" }); });}); describe("isValidHeaderName", () => { it("accepts an RFC 7230 token", () => { expect(isValidHeaderName("CF-Access-Client-Id")).toBe(true); expect(isValidHeaderName("X_Api_Key")).toBe(true); }); it("treats a blank name as unfinished rather than invalid", () => { expect(isValidHeaderName("")).toBe(true); expect(isValidHeaderName(" ")).toBe(true); }); it("rejects a name with a space or a colon", () => { expect(isValidHeaderName("Bad Header")).toBe(false); expect(isValidHeaderName("Also:Bad")).toBe(false); });});
// ---------------------------------------------------------------------------
// The row -> wire conversion behind the request-headers editor. What matters
// is that a half-typed row never reaches the transport and that a pasted
// token still works, so both are pinned here.
// ---------------------------------------------------------------------------
import { describe, expect, it } from "@effect/vitest";
import { emptyHeaderRow, isValidHeaderName, mcpHeadersFromRows } from "./request-headers";
describe("mcpHeadersFromRows", () => {
it("returns undefined when nothing is configured", () => {
expect(mcpHeadersFromRows([])).toBeUndefined();
expect(mcpHeadersFromRows([emptyHeaderRow()])).toBeUndefined();
});
it("builds the wire map from completed rows", () => {
expect(
mcpHeadersFromRows([
{ name: "CF-Access-Client-Id", value: "client-id" },
{ name: "CF-Access-Client-Secret", value: "client-secret" },
]),
).toEqual({
"CF-Access-Client-Id": "client-id",
"CF-Access-Client-Secret": "client-secret",
});
});
it("drops a row the user has not finished naming", () => {
expect(
mcpHeadersFromRows([
{ name: "X-Api-Key", value: "k" },
{ name: " ", value: "orphaned" },
]),
).toEqual({ "X-Api-Key": "k" });
});
it("trims surrounding whitespace off a pasted token", () => {
expect(mcpHeadersFromRows([{ name: " X-Token ", value: " abc123\n" }])).toEqual({
"X-Token": "abc123",
});
});
it("drops a name that cannot be put on the wire", () => {
expect(
mcpHeadersFromRows([
{ name: "Bad Header", value: "v" },
{ name: "Also:Bad", value: "v" },
{ name: "Good-Header", value: "v" },
]),
).toEqual({ "Good-Header": "v" });
});
it("keeps a header whose value is deliberately empty", () => {
expect(mcpHeadersFromRows([{ name: "X-Empty", value: "" }])).toEqual({ "X-Empty": "" });
});
it("lets a later row win a duplicated name", () => {
expect(
mcpHeadersFromRows([
{ name: "X-Token", value: "old" },
{ name: "X-Token", value: "new" },
]),
).toEqual({ "X-Token": "new" });
});
});
describe("isValidHeaderName", () => {
it("accepts an RFC 7230 token", () => {
expect(isValidHeaderName("CF-Access-Client-Id")).toBe(true);
expect(isValidHeaderName("X_Api_Key")).toBe(true);
});
it("treats a blank name as unfinished rather than invalid", () => {
expect(isValidHeaderName("")).toBe(true);
expect(isValidHeaderName(" ")).toBe(true);
});
it("rejects a name with a space or a colon", () => {
expect(isValidHeaderName("Bad Header")).toBe(false);
expect(isValidHeaderName("Also:Bad")).toBe(false);
});
});