diff options
Diffstat (limited to 'cmd/ask')
| -rw-r--r-- | cmd/ask/main.go | 16 | ||||
| -rw-r--r-- | cmd/ask/main_test.go | 28 |
2 files changed, 20 insertions, 24 deletions
diff --git a/cmd/ask/main.go b/cmd/ask/main.go index fbd5bb0..689cce0 100644 --- a/cmd/ask/main.go +++ b/cmd/ask/main.go @@ -15,19 +15,21 @@ type dispatcher interface { Dispatch(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) } -// dispatcherFactory is a test seam: override to inject a fake dispatcher so -// runMain can be exercised without a real `task` binary on PATH. -var dispatcherFactory = func() dispatcher { - return askcli.NewDispatcher(nil) +type app struct { + newDispatcher func() dispatcher } -func main() { os.Exit(runMain(os.Args[1:], os.Stdin, os.Stdout, os.Stderr)) } +func newApp() *app { + return &app{newDispatcher: func() dispatcher { return askcli.NewDispatcher(nil) }} +} + +func main() { os.Exit(newApp().runMain(os.Args[1:], os.Stdin, os.Stdout, os.Stderr)) } // runMain dispatches the command and returns the process exit code; errors // are printed to stderr. The dispatcher's exit code is returned regardless // of err so callers see Taskwarrior's own exit code on failure paths. -func runMain(args []string, stdin io.Reader, stdout, stderr io.Writer) int { - code, err := dispatcherFactory().Dispatch(context.Background(), args, stdin, stdout, stderr) +func (a *app) runMain(args []string, stdin io.Reader, stdout, stderr io.Writer) int { + code, err := a.newDispatcher().Dispatch(context.Background(), args, stdin, stdout, stderr) if err != nil { fmt.Fprintln(stderr, err) } diff --git a/cmd/ask/main_test.go b/cmd/ask/main_test.go index 643dde4..0f6a0c7 100644 --- a/cmd/ask/main_test.go +++ b/cmd/ask/main_test.go @@ -68,14 +68,11 @@ func (f *fakeDispatcher) Dispatch(_ context.Context, args []string, _ io.Reader, // Driving runMain through a fake dispatcher proves the wiring (args // forwarded, exit code returned) without touching the real ask CLI. func TestRunMain_DelegatesAndReturnsCode(t *testing.T) { - old := dispatcherFactory - t.Cleanup(func() { dispatcherFactory = old }) - fake := &fakeDispatcher{code: 0} - dispatcherFactory = func() dispatcher { return fake } + a := &app{newDispatcher: func() dispatcher { return fake }} var stdout, stderr bytes.Buffer - got := runMain([]string{"list", "limit:1"}, nil, &stdout, &stderr) + got := a.runMain([]string{"list", "limit:1"}, nil, &stdout, &stderr) if got != 0 { t.Fatalf("runMain code = %d, want 0", got) } @@ -87,30 +84,27 @@ func TestRunMain_DelegatesAndReturnsCode(t *testing.T) { } } -// The default dispatcherFactory must return a working real dispatcher (this -// is the path main() uses in production); fakes used elsewhere don't cover -// it, so verify it explicitly. -func TestDispatcherFactory_DefaultReturnsRealDispatcher(t *testing.T) { - d := dispatcherFactory() +// The default app dispatcher factory must return a working real dispatcher +// (this is the path main() uses in production); fakes used elsewhere don't +// cover it, so verify it explicitly. +func TestNewApp_DefaultReturnsRealDispatcher(t *testing.T) { + d := newApp().newDispatcher() if d == nil { - t.Fatal("default dispatcherFactory returned nil") + t.Fatal("default dispatcher factory returned nil") } if _, ok := d.(*askcli.Dispatcher); !ok { - t.Fatalf("default dispatcherFactory returned %T, want *askcli.Dispatcher", d) + t.Fatalf("default dispatcher factory returned %T, want *askcli.Dispatcher", d) } } // On a dispatcher error, runMain must print the error to stderr AND surface // the dispatcher's exit code so the shell sees Taskwarrior's own status. func TestRunMain_PrintsErrorAndPropagatesExitCode(t *testing.T) { - old := dispatcherFactory - t.Cleanup(func() { dispatcherFactory = old }) - fake := &fakeDispatcher{code: 7, err: errors.New("dispatch boom")} - dispatcherFactory = func() dispatcher { return fake } + a := &app{newDispatcher: func() dispatcher { return fake }} var stdout, stderr bytes.Buffer - got := runMain(nil, nil, &stdout, &stderr) + got := a.runMain(nil, nil, &stdout, &stderr) if got != 7 { t.Fatalf("runMain code = %d, want 7", got) } |
