diff options
Diffstat (limited to 'internal/askcli/taskexec_test.go')
| -rw-r--r-- | internal/askcli/taskexec_test.go | 134 |
1 files changed, 130 insertions, 4 deletions
diff --git a/internal/askcli/taskexec_test.go b/internal/askcli/taskexec_test.go index 2492aae..5e95f1c 100644 --- a/internal/askcli/taskexec_test.go +++ b/internal/askcli/taskexec_test.go @@ -5,15 +5,26 @@ import ( "context" "errors" "io" + "os" "os/exec" + "path/filepath" "reflect" "strings" "testing" ) +func fakeHexaiRepoDir(t *testing.T) string { + t.Helper() + base := filepath.Join(t.TempDir(), "hexai") + if err := os.MkdirAll(filepath.Join(base, ".git"), 0o755); err != nil { + t.Fatalf("mkdir .git: %v", err) + } + return base +} + func TestExecutorTaskArgs(t *testing.T) { exec_ := NewExecutor("ask") - args, err := exec_.taskArgs("/tmp/work/hexai", []string{"list", "limit:1"}) + args, err := exec_.taskArgs(context.Background(), "/tmp/work/hexai", []string{"list", "limit:1"}) if err != nil { t.Fatalf("taskArgs returned error: %v", err) } @@ -23,13 +34,65 @@ func TestExecutorTaskArgs(t *testing.T) { } } +func TestExecutorTaskArgs_NoAgentScope(t *testing.T) { + exec_ := NewExecutor("ask") + ctx := contextWithTaskScope(context.Background(), taskScopeNoAgent) + args, err := exec_.taskArgs(ctx, "/tmp/work/hexai", []string{"list", "limit:1"}) + if err != nil { + t.Fatalf("taskArgs returned error: %v", err) + } + want := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:hexai", "-agent", "list", "limit:1"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("task args = %v, want %v", args, want) + } +} + +func TestExecutorTaskArgs_ProjectOverride(t *testing.T) { + exec_ := NewExecutor("ask") + ctx := contextWithTaskProject(context.Background(), "alpha") + args, err := exec_.taskArgs(ctx, "", []string{"list", "limit:1"}) + if err != nil { + t.Fatalf("taskArgs returned error: %v", err) + } + want := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:alpha", "+agent", "list", "limit:1"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("task args = %v, want %v", args, want) + } +} + +func TestExecutorTaskArgs_AddDefaultScope(t *testing.T) { + exec_ := NewExecutor("ask") + args, err := exec_.taskArgs(context.Background(), "/tmp/work/hexai", []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "new task"}) + if err != nil { + t.Fatalf("taskArgs returned error: %v", err) + } + want := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:hexai", "add", "rc.verbose=nothing", "rc.verbose=new-uuid", "+agent", "new task"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("task args = %v, want %v", args, want) + } +} + +func TestExecutorTaskArgs_AddNoAgentScope(t *testing.T) { + exec_ := NewExecutor("ask") + ctx := contextWithTaskScope(context.Background(), taskScopeNoAgent) + args, err := exec_.taskArgs(ctx, "/tmp/work/hexai", []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "new task"}) + if err != nil { + t.Fatalf("taskArgs returned error: %v", err) + } + want := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:hexai", "add", "rc.verbose=nothing", "rc.verbose=new-uuid", "new task"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("task args = %v, want %v", args, want) + } +} + func TestExecutorRun_InjectsProjectFilterAndAgentTag(t *testing.T) { + repo := fakeHexaiRepoDir(t) var gotName string var gotArgs []string exec_ := Executor{ commandName: "ask", findBinary: func() (string, error) { return "/usr/bin/task", nil }, - detectRepoRoot: func(context.Context) (string, error) { return "/tmp/work/hexai", nil }, + detectRepoRoot: func(context.Context) (string, error) { return repo, nil }, runCommand: func(_ context.Context, name string, args []string, stdin io.Reader, stdout, stderr io.Writer) error { gotName = name gotArgs = append([]string(nil), args...) @@ -53,6 +116,67 @@ func TestExecutorRun_InjectsProjectFilterAndAgentTag(t *testing.T) { } } +func TestExecutorRun_InjectsProjectFilterAndNoAgentTag(t *testing.T) { + repo := fakeHexaiRepoDir(t) + var gotArgs []string + exec_ := Executor{ + commandName: "ask", + findBinary: func() (string, error) { return "/usr/bin/task", nil }, + detectRepoRoot: func(context.Context) (string, error) { return repo, nil }, + runCommand: func(_ context.Context, name string, args []string, stdin io.Reader, stdout, stderr io.Writer) error { + gotArgs = append([]string(nil), args...) + return nil + }, + } + + ctx := contextWithTaskScope(context.Background(), taskScopeNoAgent) + exitCode, err := exec_.Run(ctx, []string{"list", "limit:1"}, strings.NewReader("in"), &bytes.Buffer{}, &bytes.Buffer{}) + if err != nil { + t.Fatalf("Run returned error: %v", err) + } + if exitCode != 0 { + t.Fatalf("exitCode = %d, want 0", exitCode) + } + wantArgs := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:hexai", "-agent", "list", "limit:1"} + if !reflect.DeepEqual(gotArgs, wantArgs) { + t.Fatalf("task args = %v, want %v", gotArgs, wantArgs) + } +} + +func TestExecutorRun_ProjectOverrideStillLocksUsingGitRoot(t *testing.T) { + repo := fakeHexaiRepoDir(t) + var detectCalls int + var gotArgs []string + exec_ := Executor{ + commandName: "ask", + findBinary: func() (string, error) { return "/usr/bin/task", nil }, + detectRepoRoot: func(context.Context) (string, error) { + detectCalls++ + return repo, nil + }, + runCommand: func(_ context.Context, name string, args []string, stdin io.Reader, stdout, stderr io.Writer) error { + gotArgs = append([]string(nil), args...) + return nil + }, + } + + ctx := contextWithTaskProject(context.Background(), "alpha") + exitCode, err := exec_.Run(ctx, []string{"list"}, strings.NewReader(""), &bytes.Buffer{}, &bytes.Buffer{}) + if err != nil { + t.Fatalf("Run returned error: %v", err) + } + if exitCode != 0 { + t.Fatalf("exitCode = %d, want 0", exitCode) + } + if detectCalls != 1 { + t.Fatalf("detectRepoRoot calls = %d, want 1", detectCalls) + } + wantArgs := []string{"rc.verbose=nothing", "rc.confirmation=off", "project:alpha", "+agent", "list"} + if !reflect.DeepEqual(gotArgs, wantArgs) { + t.Fatalf("task args = %v, want %v", gotArgs, wantArgs) + } +} + func TestExecutorRun_OutsideGitRepo_IsActionable(t *testing.T) { exec_ := Executor{ commandName: "ask", @@ -74,10 +198,11 @@ func TestExecutorRun_OutsideGitRepo_IsActionable(t *testing.T) { } func TestExecutorRun_PreservesTaskwarriorExitCode(t *testing.T) { + repo := fakeHexaiRepoDir(t) exec_ := Executor{ commandName: "ask", findBinary: func() (string, error) { return "/usr/bin/task", nil }, - detectRepoRoot: func(context.Context) (string, error) { return "/tmp/work/hexai", nil }, + detectRepoRoot: func(context.Context) (string, error) { return repo, nil }, runCommand: func(context.Context, string, []string, io.Reader, io.Writer, io.Writer) error { return exec.Command("sh", "-c", "exit 7").Run() }, @@ -93,12 +218,13 @@ func TestExecutorRun_PreservesTaskwarriorExitCode(t *testing.T) { } func TestExecutorRun_PreservesStdoutAndStderr(t *testing.T) { + repo := fakeHexaiRepoDir(t) var stdout bytes.Buffer var stderr bytes.Buffer exec_ := Executor{ commandName: "ask", findBinary: func() (string, error) { return "/usr/bin/task", nil }, - detectRepoRoot: func(context.Context) (string, error) { return "/tmp/work/hexai", nil }, + detectRepoRoot: func(context.Context) (string, error) { return repo, nil }, runCommand: func(_ context.Context, name string, args []string, stdin io.Reader, out, errOut io.Writer) error { _, _ = io.WriteString(out, "task stdout") _, _ = io.WriteString(errOut, "task stderr") |
