Skip to content

Commit

Permalink
fix(confirm): --timeout was being ignored (#697)
Browse files Browse the repository at this point in the history
* fix(confirm) Options.Timeout was ignored, now works as documented

* Streamlines command.go per PR feedback
  • Loading branch information
dpritchett authored Nov 15, 2024
1 parent 93da22d commit 19e79b1
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 1 deletion.
14 changes: 13 additions & 1 deletion confirm/command.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package confirm

import (
"errors"
"fmt"
"os"

Expand All @@ -26,12 +27,15 @@ func (o Options) Run() error {
Value(&choice),
),
).
WithTimeout(o.Timeout).
WithTheme(theme).
WithShowHelp(o.ShowHelp).
Run()

if err != nil {
return fmt.Errorf("unable to run confirm: %w", err)
if !o.errIsValidTimeout(err) {
return fmt.Errorf("unable to run confirm: %w", err)
}
}

if !choice {
Expand All @@ -40,3 +44,11 @@ func (o Options) Run() error {

return nil
}

// errIsValidTimeout returns false unless 1) the user has specified a nonzero timeout and 2) the error is a huh.ErrTimeout.
func (o Options) errIsValidTimeout(err error) bool {
errWasTimeout := errors.Is(err, huh.ErrTimeout)
timeoutsExpected := o.Timeout > 0

return errWasTimeout && timeoutsExpected
}
54 changes: 54 additions & 0 deletions confirm/command_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package confirm

import (
"fmt"
"github.com/charmbracelet/huh"
"testing"
"time"
)

func TestOptions_errIsValidTimeout(t *testing.T) {
type testCase struct {
Description string
GivenTimeout time.Duration
GivenError error
ExpectedResult bool
}

cases := []testCase{
{
Description: "timeout is positive, err is a timeout",
GivenTimeout: time.Second,
GivenError: huh.ErrTimeout,
ExpectedResult: true,
},
{
Description: "timeout is zero, err is a timeout",
GivenTimeout: 0,
GivenError: huh.ErrTimeout,
ExpectedResult: false,
},
{
Description: "timeout is positive, err is not a timeout",
GivenTimeout: 1,
GivenError: fmt.Errorf("i'm not a timeout"),
ExpectedResult: false,
},
{
Description: "timeout is zero, err is not a timeout",
GivenTimeout: 0,
GivenError: fmt.Errorf("i'm not a timeout"),
ExpectedResult: false,
},
}

for _, testCase := range cases {
t.Run(testCase.Description, func(t *testing.T) {
sut := Options{Timeout: testCase.GivenTimeout}
actualResult := sut.errIsValidTimeout(testCase.GivenError)
if actualResult != testCase.ExpectedResult {
t.Errorf("got: %v, want: %v", actualResult, testCase.ExpectedResult)
}
})
}
}

0 comments on commit 19e79b1

Please sign in to comment.