mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
新增覆盖: effort, tokenBudget, displayTags, taggedId, controlMessageCompat, MCP normalization/envExpansion, gitConfigParser, formatBriefTimestamp, hyperlink, windowsPaths, notebook Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
104 lines
3.6 KiB
TypeScript
104 lines
3.6 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { normalizeControlMessageKeys } from "../controlMessageCompat";
|
|
|
|
describe("normalizeControlMessageKeys", () => {
|
|
// --- basic camelCase to snake_case ---
|
|
test("converts requestId to request_id", () => {
|
|
const obj = { requestId: "123" };
|
|
const result = normalizeControlMessageKeys(obj);
|
|
expect(result).toEqual({ request_id: "123" });
|
|
expect((result as any).requestId).toBeUndefined();
|
|
});
|
|
|
|
test("leaves request_id unchanged", () => {
|
|
const obj = { request_id: "123" };
|
|
normalizeControlMessageKeys(obj);
|
|
expect(obj).toEqual({ request_id: "123" });
|
|
});
|
|
|
|
// --- both present: snake_case wins ---
|
|
test("keeps snake_case when both requestId and request_id exist", () => {
|
|
const obj = { requestId: "camel", request_id: "snake" };
|
|
const result = normalizeControlMessageKeys(obj) as any;
|
|
expect(result.request_id).toBe("snake");
|
|
// requestId is NOT deleted when request_id already exists
|
|
// because the condition `!('request_id' in record)` prevents the branch
|
|
expect(result.requestId).toBe("camel");
|
|
});
|
|
|
|
// --- nested response ---
|
|
test("normalizes nested response.requestId", () => {
|
|
const obj = { response: { requestId: "456" } };
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).response.request_id).toBe("456");
|
|
expect((obj as any).response.requestId).toBeUndefined();
|
|
});
|
|
|
|
test("leaves nested response.request_id unchanged", () => {
|
|
const obj = { response: { request_id: "789" } };
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).response.request_id).toBe("789");
|
|
});
|
|
|
|
test("nested response: snake_case wins when both present", () => {
|
|
const obj = {
|
|
response: { requestId: "camel", request_id: "snake" },
|
|
};
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).response.request_id).toBe("snake");
|
|
expect((obj as any).response.requestId).toBe("camel");
|
|
});
|
|
|
|
// --- non-object inputs ---
|
|
test("returns null as-is", () => {
|
|
expect(normalizeControlMessageKeys(null)).toBeNull();
|
|
});
|
|
|
|
test("returns undefined as-is", () => {
|
|
expect(normalizeControlMessageKeys(undefined)).toBeUndefined();
|
|
});
|
|
|
|
test("returns string as-is", () => {
|
|
expect(normalizeControlMessageKeys("hello")).toBe("hello");
|
|
});
|
|
|
|
test("returns number as-is", () => {
|
|
expect(normalizeControlMessageKeys(42)).toBe(42);
|
|
});
|
|
|
|
// --- empty and edge cases ---
|
|
test("empty object is unchanged", () => {
|
|
const obj = {};
|
|
normalizeControlMessageKeys(obj);
|
|
expect(obj).toEqual({});
|
|
});
|
|
|
|
test("mutates the original object in place", () => {
|
|
const obj = { requestId: "abc", other: "data" };
|
|
const result = normalizeControlMessageKeys(obj);
|
|
expect(result).toBe(obj); // same reference
|
|
expect(obj).toEqual({ request_id: "abc", other: "data" });
|
|
});
|
|
|
|
test("does not affect other keys on the object", () => {
|
|
const obj = { requestId: "123", type: "control_request", payload: {} };
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).type).toBe("control_request");
|
|
expect((obj as any).payload).toEqual({});
|
|
expect((obj as any).request_id).toBe("123");
|
|
});
|
|
|
|
test("handles response being null", () => {
|
|
const obj = { response: null, requestId: "x" };
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).request_id).toBe("x");
|
|
expect((obj as any).response).toBeNull();
|
|
});
|
|
|
|
test("handles response being a non-object (string)", () => {
|
|
const obj = { response: "not-an-object" };
|
|
normalizeControlMessageKeys(obj);
|
|
expect((obj as any).response).toBe("not-an-object");
|
|
});
|
|
});
|