diff --git a/app.go b/app.go index 59bf68df95..1767c0e5b0 100644 --- a/app.go +++ b/app.go @@ -72,6 +72,8 @@ type App struct { Authors []*Author // Copyright of the binary if any Copyright string + // Reader reader to write input to (useful for tests) + Reader io.Reader // Writer writer to write output to Writer io.Writer // ErrWriter writes error output @@ -117,6 +119,7 @@ func NewApp() *App { BashComplete: DefaultAppComplete, Action: helpCommand.Action, Compiled: compileTime(), + Reader: os.Stdin, Writer: os.Stdout, ErrWriter: os.Stderr, } @@ -160,6 +163,10 @@ func (a *App) Setup() { a.Compiled = compileTime() } + if a.Reader == nil { + a.Reader = os.Stdin + } + if a.Writer == nil { a.Writer = os.Stdout } diff --git a/app_test.go b/app_test.go index 6c95faa612..57c850d1ed 100644 --- a/app_test.go +++ b/app_test.go @@ -433,6 +433,12 @@ func TestApp_Command(t *testing.T) { } } +func TestApp_Setup_defaultsReader(t *testing.T) { + app := &App{} + app.Setup() + expect(t, app.Reader, os.Stdin) +} + func TestApp_Setup_defaultsWriter(t *testing.T) { app := &App{} app.Setup() @@ -850,6 +856,15 @@ func TestApp_ParseSliceFlagsWithMissingValue(t *testing.T) { } } +func TestApp_DefaultStdin(t *testing.T) { + app := &App{} + app.Setup() + + if app.Reader != os.Stdin { + t.Error("Default input reader not set.") + } +} + func TestApp_DefaultStdout(t *testing.T) { app := &App{} app.Setup() @@ -859,6 +874,29 @@ func TestApp_DefaultStdout(t *testing.T) { } } +func TestApp_SetStdin(t *testing.T) { + buf := make([]byte, 12) + + app := &App{ + Name: "test", + Reader: strings.NewReader("Hello World!"), + Action: func(c *Context) error { + _, err := c.App.Reader.Read(buf) + return err + }, + } + + err := app.Run([]string{"help"}) + + if err != nil { + t.Fatalf("Run error: %s", err) + } + + if string(buf) != "Hello World!" { + t.Error("App did not read input from desired reader.") + } +} + func TestApp_SetStdout(t *testing.T) { var w bytes.Buffer