cli-arguments.test.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { describe, expect, test } from "bun:test";
  2. // Test Commander.js option parsing independently from main.tsx initialization.
  3. // main.tsx has heavy bootstrap dependencies; we test the CLI argument parsing
  4. // patterns it uses to ensure correct behavior.
  5. const { Command } = require("/Users/konghayao/code/ai/claude-code/node_modules/.old_modules-13e6b62a502cda34/commander/index.js");
  6. function createTestProgram(): Command {
  7. const program = new Command();
  8. program
  9. .name("claude-code")
  10. .description("CLI test")
  11. .exitOverride() // prevent process.exit during tests
  12. .option("-p, --print", "pipe mode")
  13. .option("--resume", "resume session")
  14. .option("-v, --verbose", "verbose output")
  15. .option("--model <model>", "model to use")
  16. .option("--system-prompt <prompt>", "system prompt")
  17. .option("--allowedTools <tools...>", "allowed tools")
  18. .option("--max-turns <n>", "max conversation turns", parseInt)
  19. .version("1.0.0", "-V, --version", "display version");
  20. return program;
  21. }
  22. describe("CLI arguments: option parsing", () => {
  23. test("no flags returns empty opts", () => {
  24. const program = createTestProgram();
  25. program.parse(["node", "test"]);
  26. expect(program.opts()).toEqual({});
  27. });
  28. test("-p sets print flag", () => {
  29. const program = createTestProgram();
  30. program.parse(["node", "test", "-p"]);
  31. expect(program.opts().print).toBe(true);
  32. });
  33. test("--print is equivalent to -p", () => {
  34. const program = createTestProgram();
  35. program.parse(["node", "test", "--print"]);
  36. expect(program.opts().print).toBe(true);
  37. });
  38. test("--resume sets resume flag", () => {
  39. const program = createTestProgram();
  40. program.parse(["node", "test", "--resume"]);
  41. expect(program.opts().resume).toBe(true);
  42. });
  43. test("-v sets verbose flag", () => {
  44. const program = createTestProgram();
  45. program.parse(["node", "test", "-v"]);
  46. expect(program.opts().verbose).toBe(true);
  47. });
  48. test("--model captures string value", () => {
  49. const program = createTestProgram();
  50. program.parse(["node", "test", "--model", "claude-opus-4-6"]);
  51. expect(program.opts().model).toBe("claude-opus-4-6");
  52. });
  53. test("--system-prompt captures string value", () => {
  54. const program = createTestProgram();
  55. program.parse(["node", "test", "--system-prompt", "Be concise"]);
  56. expect(program.opts().systemPrompt).toBe("Be concise");
  57. });
  58. test("--max-turns parses integer value", () => {
  59. const program = createTestProgram();
  60. program.parse(["node", "test", "--max-turns", "10"]);
  61. expect(program.opts().maxTurns).toBe(10);
  62. });
  63. test("multiple flags can be combined", () => {
  64. const program = createTestProgram();
  65. program.parse(["node", "test", "-p", "-v", "--model", "opus"]);
  66. expect(program.opts().print).toBe(true);
  67. expect(program.opts().verbose).toBe(true);
  68. expect(program.opts().model).toBe("opus");
  69. });
  70. test("--version throws Commander.CommandError with exit code 0", () => {
  71. const program = createTestProgram();
  72. let error: any;
  73. try {
  74. program.parse(["node", "test", "--version"]);
  75. } catch (e) {
  76. error = e;
  77. }
  78. expect(error).toBeDefined();
  79. expect(error.code).toBe("commander.version");
  80. expect(error.exitCode).toBe(0);
  81. });
  82. test("unknown flags throw CommanderError", () => {
  83. const program = createTestProgram();
  84. expect(() => program.parse(["node", "test", "--nonexistent"])).toThrow();
  85. });
  86. });