test: 新增测试代码文件

This commit is contained in:
claude-code-best
2026-04-02 14:44:56 +08:00
parent 9c3803d16b
commit 006ad97fbb
32 changed files with 1102 additions and 68 deletions

View File

@@ -1,4 +1,4 @@
import { mock, describe, expect, test } from "bun:test";
import { mock, describe, expect, test, beforeEach, afterEach } from "bun:test";
// Mock slowOperations to cut bootstrap/state dependency chain
// (figures.js → env.js → fsOperations.js → slowOperations.js → bootstrap/state.js)
@@ -57,6 +57,8 @@ describe("permissionModeFromString", () => {
expect(permissionModeFromString("plan")).toBe("plan");
expect(permissionModeFromString("default")).toBe("default");
expect(permissionModeFromString("dontAsk")).toBe("dontAsk");
expect(permissionModeFromString("acceptEdits")).toBe("acceptEdits");
expect(permissionModeFromString("bypassPermissions")).toBe("bypassPermissions");
});
test("returns 'default' for unknown string", () => {
@@ -72,6 +74,8 @@ describe("permissionModeTitle", () => {
expect(permissionModeTitle("default")).toBe("Default");
expect(permissionModeTitle("plan")).toBe("Plan Mode");
expect(permissionModeTitle("acceptEdits")).toBe("Accept edits");
expect(permissionModeTitle("bypassPermissions")).toBe("Bypass Permissions");
expect(permissionModeTitle("dontAsk")).toBe("Don't Ask");
});
test("falls back to Default for unknown mode", () => {
@@ -86,6 +90,8 @@ describe("permissionModeShortTitle", () => {
expect(permissionModeShortTitle("default")).toBe("Default");
expect(permissionModeShortTitle("plan")).toBe("Plan");
expect(permissionModeShortTitle("bypassPermissions")).toBe("Bypass");
expect(permissionModeShortTitle("dontAsk")).toBe("DontAsk");
expect(permissionModeShortTitle("acceptEdits")).toBe("Accept");
});
});
@@ -116,6 +122,14 @@ describe("getModeColor", () => {
test("returns 'error' for bypassPermissions", () => {
expect(getModeColor("bypassPermissions")).toBe("error");
});
test("returns 'error' for dontAsk", () => {
expect(getModeColor("dontAsk")).toBe("error");
});
test("returns 'autoAccept' for acceptEdits", () => {
expect(getModeColor("acceptEdits")).toBe("autoAccept");
});
});
// ─── isDefaultMode ─────────────────────────────────────────────────────
@@ -149,6 +163,14 @@ describe("toExternalPermissionMode", () => {
test("maps dontAsk to dontAsk", () => {
expect(toExternalPermissionMode("dontAsk")).toBe("dontAsk");
});
test("maps acceptEdits to acceptEdits", () => {
expect(toExternalPermissionMode("acceptEdits")).toBe("acceptEdits");
});
test("maps bypassPermissions to bypassPermissions", () => {
expect(toExternalPermissionMode("bypassPermissions")).toBe("bypassPermissions");
});
});
// ─── isExternalPermissionMode ──────────────────────────────────────────
@@ -159,4 +181,34 @@ describe("isExternalPermissionMode", () => {
expect(isExternalPermissionMode("default")).toBe(true);
expect(isExternalPermissionMode("plan")).toBe(true);
});
describe("when USER_TYPE is 'ant'", () => {
const savedUserType = process.env.USER_TYPE;
beforeEach(() => {
process.env.USER_TYPE = "ant";
});
afterEach(() => {
if (savedUserType !== undefined) {
process.env.USER_TYPE = savedUserType;
} else {
delete process.env.USER_TYPE;
}
});
test("returns false for 'auto' (ant-only mode)", () => {
expect(isExternalPermissionMode("auto")).toBe(false);
});
test("returns false for 'bubble' (ant-only mode)", () => {
expect(isExternalPermissionMode("bubble")).toBe(false);
});
test("returns true for standard external modes", () => {
expect(isExternalPermissionMode("default")).toBe(true);
expect(isExternalPermissionMode("plan")).toBe(true);
expect(isExternalPermissionMode("dontAsk")).toBe(true);
});
});
});

View File

@@ -28,6 +28,32 @@ describe("CROSS_PLATFORM_CODE_EXEC", () => {
expect(CROSS_PLATFORM_CODE_EXEC).toContain("bash");
expect(CROSS_PLATFORM_CODE_EXEC).toContain("sh");
});
test("has no duplicate entries", () => {
expect(new Set(CROSS_PLATFORM_CODE_EXEC).size).toBe(
CROSS_PLATFORM_CODE_EXEC.length
);
});
test("contains expected interpreters", () => {
const expected = [
"node",
"python",
"python3",
"ruby",
"perl",
"php",
"lua",
"deno",
"npx",
"bunx",
"tsx",
];
const set = new Set(CROSS_PLATFORM_CODE_EXEC);
for (const entry of expected) {
expect(set.has(entry)).toBe(true);
}
});
});
describe("DANGEROUS_BASH_PATTERNS", () => {
@@ -52,4 +78,16 @@ describe("DANGEROUS_BASH_PATTERNS", () => {
expect(typeof p).toBe("string");
}
});
test("has no duplicate entries", () => {
expect(new Set(DANGEROUS_BASH_PATTERNS).size).toBe(
DANGEROUS_BASH_PATTERNS.length
);
});
test("empty string does not match any pattern", () => {
for (const pattern of DANGEROUS_BASH_PATTERNS) {
expect("".startsWith(pattern)).toBe(false);
}
});
});