feat(pkg/prompt/stubber): allow passing an error as Value

this allows testing error paths in code:

Pass an `error` type as the Value, it will be reflect-checked if it is
an error, and be returned

```golang
as, restoreAsk := prompt.InitAskStubber()
defer restoreAsk()

as.Stub([]*prompt.QuestionStub{
    {
        Name:  "assignee",
        Value: errors.New("meant to fail"),
    },
})
```

Example code that will benefit:

```golang
var confirmAnswers []string
err := prompt.MultiSelect(&confirmAnswers, "metadata", "Which metadata types to add?", options)
if err != nil {
    return nil, fmt.Errorf("could not prompt: %w", err)
}
```
This commit is contained in:
Leo 2021-01-03 08:40:13 -03:00
parent 8e19d3e75b
commit 70672aff18
1 changed files with 22 additions and 0 deletions

View File

@ -44,8 +44,19 @@ func InitAskStubber() (*AskStubber, func()) {
if stubbedPrompt.Default {
// TODO this is failing for basic AskOne invocations with a string result.
defaultValue := reflect.ValueOf(p).Elem().FieldByName("Default")
// If the user passed us an error, return it
if err, ok := defaultValue.Interface().(error); ok {
return err
}
_ = core.WriteAnswer(response, "", defaultValue)
} else {
// If the user passed us an error, return it
if err, ok := stubbedPrompt.Value.(error); ok {
return err
}
_ = core.WriteAnswer(response, "", stubbedPrompt.Value)
}
@ -69,8 +80,19 @@ func InitAskStubber() (*AskStubber, func()) {
}
if sq.Default {
defaultValue := reflect.ValueOf(q.Prompt).Elem().FieldByName("Default")
// If the user passed us an error, return it
if err, ok := defaultValue.Interface().(error); ok {
return err
}
_ = core.WriteAnswer(response, q.Name, defaultValue)
} else {
// If the user passed us an error, return it
if err, ok := sq.Value.(error); ok {
return err
}
_ = core.WriteAnswer(response, q.Name, sq.Value)
}
}