2017-08-12 12:25:38 -04:00
|
|
|
package cli
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2022-02-25 09:30:38 -05:00
|
|
|
"io"
|
2017-08-12 12:25:38 -04:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/spf13/cobra"
|
2020-02-22 12:12:14 -05:00
|
|
|
"gotest.tools/v3/assert"
|
2017-08-12 12:25:38 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestRequiresNoArgs(t *testing.T) {
|
|
|
|
testCases := []testCase{
|
|
|
|
{
|
|
|
|
validateFunc: NoArgs,
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo"},
|
|
|
|
validateFunc: NoArgs,
|
|
|
|
expectedError: "accepts no arguments.",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
runTestCases(t, testCases)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequiresMinArgs(t *testing.T) {
|
|
|
|
testCases := []testCase{
|
|
|
|
{
|
|
|
|
validateFunc: RequiresMinArgs(0),
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validateFunc: RequiresMinArgs(1),
|
|
|
|
expectedError: "at least 1 argument.",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo"},
|
|
|
|
validateFunc: RequiresMinArgs(2),
|
|
|
|
expectedError: "at least 2 arguments.",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
runTestCases(t, testCases)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequiresMaxArgs(t *testing.T) {
|
|
|
|
testCases := []testCase{
|
|
|
|
{
|
|
|
|
validateFunc: RequiresMaxArgs(0),
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo", "bar"},
|
|
|
|
validateFunc: RequiresMaxArgs(1),
|
|
|
|
expectedError: "at most 1 argument.",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo", "bar", "baz"},
|
|
|
|
validateFunc: RequiresMaxArgs(2),
|
|
|
|
expectedError: "at most 2 arguments.",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
runTestCases(t, testCases)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequiresRangeArgs(t *testing.T) {
|
|
|
|
testCases := []testCase{
|
|
|
|
{
|
|
|
|
validateFunc: RequiresRangeArgs(0, 0),
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validateFunc: RequiresRangeArgs(0, 1),
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo", "bar"},
|
|
|
|
validateFunc: RequiresRangeArgs(0, 1),
|
|
|
|
expectedError: "at most 1 argument.",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
args: []string{"foo", "bar", "baz"},
|
|
|
|
validateFunc: RequiresRangeArgs(0, 2),
|
|
|
|
expectedError: "at most 2 arguments.",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validateFunc: RequiresRangeArgs(1, 2),
|
|
|
|
expectedError: "at least 1 ",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
runTestCases(t, testCases)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestExactArgs(t *testing.T) {
|
|
|
|
testCases := []testCase{
|
|
|
|
{
|
|
|
|
validateFunc: ExactArgs(0),
|
|
|
|
expectedError: "no error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validateFunc: ExactArgs(1),
|
|
|
|
expectedError: "exactly 1 argument.",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
validateFunc: ExactArgs(2),
|
|
|
|
expectedError: "exactly 2 arguments.",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
runTestCases(t, testCases)
|
|
|
|
}
|
|
|
|
|
|
|
|
type testCase struct {
|
|
|
|
args []string
|
|
|
|
validateFunc cobra.PositionalArgs
|
|
|
|
expectedError string
|
|
|
|
}
|
|
|
|
|
|
|
|
func runTestCases(t *testing.T, testCases []testCase) {
|
|
|
|
for _, tc := range testCases {
|
|
|
|
cmd := newDummyCommand(tc.validateFunc)
|
|
|
|
cmd.SetArgs(tc.args)
|
2022-02-25 09:30:38 -05:00
|
|
|
cmd.SetOut(io.Discard)
|
2017-08-12 12:25:38 -04:00
|
|
|
|
|
|
|
err := cmd.Execute()
|
2017-12-21 16:27:57 -05:00
|
|
|
assert.ErrorContains(t, err, tc.expectedError)
|
2017-08-12 12:25:38 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func newDummyCommand(validationFunc cobra.PositionalArgs) *cobra.Command {
|
|
|
|
cmd := &cobra.Command{
|
|
|
|
Use: "dummy",
|
|
|
|
Args: validationFunc,
|
|
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
|
|
return errors.New("no error")
|
|
|
|
},
|
|
|
|
}
|
|
|
|
return cmd
|
|
|
|
}
|