diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-22 16:03:43 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-22 16:03:43 +0300 |
| commit | 2fe84d129c45dfc1db38a48421ac7036eb4e6337 (patch) | |
| tree | 6123798e51337bcc011cea949ecaf4aebe3497b3 /internal/askcli | |
| parent | 604f5aa7603498c4f7cc9a649a86d525b824e6c9 (diff) | |
Fix ask default add dispatch for w7
Diffstat (limited to 'internal/askcli')
| -rw-r--r-- | internal/askcli/dispatch.go | 2 | ||||
| -rw-r--r-- | internal/askcli/dispatch_test.go | 93 |
2 files changed, 84 insertions, 11 deletions
diff --git a/internal/askcli/dispatch.go b/internal/askcli/dispatch.go index e326017..cd2aae7 100644 --- a/internal/askcli/dispatch.go +++ b/internal/askcli/dispatch.go @@ -56,7 +56,7 @@ func (d *Dispatcher) Dispatch(ctx context.Context, args []string, stdin io.Reade } subcommand := args[0] entry, ok := commandRegistry.get(subcommand) - if !ok && scope != taskScopeAgent { + if !ok { args = append([]string{"add"}, args...) subcommand = "add" entry, ok = commandRegistry.get(subcommand) diff --git a/internal/askcli/dispatch_test.go b/internal/askcli/dispatch_test.go index d8f1458..20062b0 100644 --- a/internal/askcli/dispatch_test.go +++ b/internal/askcli/dispatch_test.go @@ -43,19 +43,92 @@ func TestDispatcher_Help(t *testing.T) { } } -func TestDispatcher_UnknownSubcommand(t *testing.T) { - d := NewDispatcher(nil) - var stderr bytes.Buffer - code, err := d.Dispatch(context.Background(), []string{"foobar"}, nil, io.Discard, &stderr) - if code != 1 { - t.Fatalf("unknown subcommand exit code = %d, want 1", code) +func TestDispatcher_DefaultsInvalidSubcommandToAdd(t *testing.T) { + dir := t.TempDir() + oldRoot := taskAliasCacheRoot + oldNow := nowTaskAliasCache + taskAliasCacheRoot = func() (string, error) { return filepath.Join(dir, "hexai"), nil } + nowTaskAliasCache = func() time.Time { return time.Date(2026, 4, 22, 12, 0, 0, 0, time.UTC) } + defer func() { + taskAliasCacheRoot = oldRoot + nowTaskAliasCache = oldNow + }() + + tests := []struct { + name string + args []string + wantCall []string + wantProject string + }{ + { + name: "plain", + args: []string{"foo", "bar", "baz"}, + wantCall: []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "foo bar baz"}, + }, + { + name: "project scoped", + args: []string{"proj:alpha", "foo", "bar", "baz"}, + wantCall: []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "foo bar baz"}, + wantProject: "alpha", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + var gotCall []string + var gotProject string + d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) { + gotCall = append([]string(nil), args...) + gotProject, _ = taskProjectFromContext(ctx) + _, _ = io.WriteString(stdout, "Created task uuid-default-add.\n") + return 0, nil + }}) + + var stdout, stderr bytes.Buffer + code, err := d.Dispatch(context.Background(), tc.args, nil, &stdout, &stderr) + if err != nil { + t.Fatalf("Dispatch returned error: %v", err) + } + if code != 0 { + t.Fatalf("Dispatch code = %d, want 0: stderr=%s", code, stderr.String()) + } + if !reflect.DeepEqual(gotCall, tc.wantCall) { + t.Fatalf("runner args = %v, want %v", gotCall, tc.wantCall) + } + if gotProject != tc.wantProject { + t.Fatalf("project override = %q, want %q", gotProject, tc.wantProject) + } + if stdout.String() != "created task 0\n" { + t.Fatalf("stdout = %q, want created task alias", stdout.String()) + } + if stderr.Len() != 0 { + t.Fatalf("stderr = %q, want empty", stderr.String()) + } + }) } +} + +func TestDispatcher_RealSubcommandsDoNotDefaultToAdd(t *testing.T) { + var gotCall []string + d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) { + gotCall = append([]string(nil), args...) + _, _ = io.WriteString(stdout, `[]`) + return 0, nil + }}) + + var stdout, stderr bytes.Buffer + code, err := d.Dispatch(context.Background(), []string{"list", "+ready"}, nil, &stdout, &stderr) if err != nil { - t.Fatalf("unknown subcommand returned unexpected error: %v", err) + t.Fatalf("Dispatch returned error: %v", err) + } + if code != 0 { + t.Fatalf("Dispatch code = %d, want 0: stderr=%s", code, stderr.String()) + } + if want := []string{"status:pending", "+ready", "export"}; !reflect.DeepEqual(gotCall, want) { + t.Fatalf("runner args = %v, want %v", gotCall, want) } - output := stderr.String() - if !strings.Contains(output, "unknown subcommand") { - t.Fatalf("unknown subcommand output missing: %s", output) + if !strings.Contains(stdout.String(), "Description") { + t.Fatalf("stdout = %q, want rendered task list", stdout.String()) } } |
