Skip to content

Commit

Permalink
fix(confirm) Options.Timeout was ignored, now works as documented
Browse files Browse the repository at this point in the history
  • Loading branch information
dpritchett committed Oct 31, 2024
1 parent 1023911 commit cf0a8d1
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
15 changes: 14 additions & 1 deletion confirm/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,17 @@ 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)
allowErr := o.errIsValidTimeout(err)

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

if !choice {
Expand All @@ -40,3 +45,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 := err.Error() == huh.ErrTimeout.Error()
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 cf0a8d1

Please sign in to comment.