summaryrefslogtreecommitdiff
path: root/internal/askcli/taskexec_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/askcli/taskexec_test.go')
-rw-r--r--internal/askcli/taskexec_test.go134
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")