summaryrefslogtreecommitdiff
path: root/internal/executor/claude_test.go
blob: faf25568a344751e99681dc328b6c19e291a831c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package executor

import (
	"testing"

	"github.com/thepeterstone/claudomator/internal/task"
)

func TestClaudeRunner_BuildArgs_BasicTask(t *testing.T) {
	r := &ClaudeRunner{}
	tk := &task.Task{
		Claude: task.ClaudeConfig{
			Instructions: "fix the bug",
			Model:        "sonnet",
		},
	}

	args := r.buildArgs(tk)

	expected := []string{"-p", "fix the bug", "--output-format", "stream-json", "--model", "sonnet"}
	if len(args) != len(expected) {
		t.Fatalf("args length: want %d, got %d: %v", len(expected), len(args), args)
	}
	for i, want := range expected {
		if args[i] != want {
			t.Errorf("arg[%d]: want %q, got %q", i, want, args[i])
		}
	}
}

func TestClaudeRunner_BuildArgs_FullConfig(t *testing.T) {
	r := &ClaudeRunner{}
	tk := &task.Task{
		Claude: task.ClaudeConfig{
			Instructions:       "implement feature",
			Model:              "opus",
			MaxBudgetUSD:       5.0,
			PermissionMode:     "bypassPermissions",
			SystemPromptAppend: "Follow TDD",
			AllowedTools:       []string{"Bash", "Edit"},
			DisallowedTools:    []string{"Write"},
			ContextFiles:       []string{"/src"},
			AdditionalArgs:     []string{"--verbose"},
		},
	}

	args := r.buildArgs(tk)

	// Check key args are present.
	argMap := make(map[string]bool)
	for _, a := range args {
		argMap[a] = true
	}

	requiredArgs := []string{
		"-p", "implement feature", "--output-format", "stream-json",
		"--model", "opus", "--max-budget-usd", "5.00",
		"--permission-mode", "bypassPermissions",
		"--append-system-prompt", "Follow TDD",
		"--allowedTools", "Bash", "Edit",
		"--disallowedTools", "Write",
		"--add-dir", "/src",
		"--verbose",
	}
	for _, req := range requiredArgs {
		if !argMap[req] {
			t.Errorf("missing arg %q in %v", req, args)
		}
	}
}

func TestClaudeRunner_BinaryPath_Default(t *testing.T) {
	r := &ClaudeRunner{}
	if r.binaryPath() != "claude" {
		t.Errorf("want 'claude', got %q", r.binaryPath())
	}
}

func TestClaudeRunner_BinaryPath_Custom(t *testing.T) {
	r := &ClaudeRunner{BinaryPath: "/usr/local/bin/claude"}
	if r.binaryPath() != "/usr/local/bin/claude" {
		t.Errorf("want custom path, got %q", r.binaryPath())
	}
}