corrects the storage and provider flag positioning to attach to the child command instead of the parent. Also corrects unit tests for flags to ensure flags are preset as expected. --- #### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🐛 Bugfix #### Test Plan - [x] ⚡ Unit test - [x] 💚 E2E
118 lines
2.4 KiB
Go
118 lines
2.4 KiB
Go
package testdata
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/alcionai/clues"
|
|
"github.com/google/uuid"
|
|
"github.com/spf13/cobra"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/alcionai/corso/src/cli/flags"
|
|
"github.com/alcionai/corso/src/internal/tester"
|
|
)
|
|
|
|
// StubRootCmd builds a stub cobra command to be used as
|
|
// the root command for integration testing on the CLI
|
|
func StubRootCmd(args ...string) *cobra.Command {
|
|
id := uuid.NewString()
|
|
now := time.Now().UTC().Format(time.RFC3339Nano)
|
|
cmdArg := "testing-corso"
|
|
c := &cobra.Command{
|
|
Use: cmdArg,
|
|
Short: id,
|
|
Long: id + " - " + now,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
fmt.Fprintf(cmd.OutOrStdout(), "test command args: %+v", args)
|
|
return nil
|
|
},
|
|
}
|
|
c.SetArgs(args)
|
|
|
|
return c
|
|
}
|
|
|
|
type UseCobraCommandFn func(*cobra.Command)
|
|
|
|
func SetUpCmdHasFlags(
|
|
t *testing.T,
|
|
parentCmd *cobra.Command,
|
|
addChildCommand func(*cobra.Command) *cobra.Command,
|
|
addFlags []UseCobraCommandFn,
|
|
setArgs UseCobraCommandFn,
|
|
) *cobra.Command {
|
|
parentCmd.PersistentPreRun = func(c *cobra.Command, args []string) {
|
|
t.Log("testing args:")
|
|
|
|
for _, arg := range args {
|
|
t.Log(arg)
|
|
}
|
|
}
|
|
|
|
// persistent flags not added by addCommands
|
|
flags.AddRunModeFlag(parentCmd, true)
|
|
|
|
cmd := addChildCommand(parentCmd)
|
|
require.NotNil(t, cmd)
|
|
|
|
cul := cmd.UseLine()
|
|
require.Truef(
|
|
t,
|
|
strings.HasPrefix(cul, parentCmd.Use+" "+cmd.Use),
|
|
"child command has expected usage format 'parent child', got %q",
|
|
cul)
|
|
|
|
for _, af := range addFlags {
|
|
af(cmd)
|
|
}
|
|
|
|
setArgs(parentCmd)
|
|
|
|
parentCmd.SetOut(new(bytes.Buffer)) // drop output
|
|
parentCmd.SetErr(new(bytes.Buffer)) // drop output
|
|
|
|
err := parentCmd.Execute()
|
|
assert.NoError(t, err, clues.ToCore(err))
|
|
|
|
return cmd
|
|
}
|
|
|
|
type CobraRunEFn func(cmd *cobra.Command, args []string) error
|
|
|
|
func CheckCmdChild(
|
|
t *testing.T,
|
|
cmd *cobra.Command,
|
|
expectChildCount int,
|
|
expectUse string,
|
|
expectShort string,
|
|
expectRunE CobraRunEFn,
|
|
) {
|
|
var (
|
|
cmds = cmd.Commands()
|
|
child *cobra.Command
|
|
)
|
|
|
|
for _, cc := range cmds {
|
|
if cc.Use == expectUse {
|
|
child = cc
|
|
break
|
|
}
|
|
}
|
|
|
|
require.Len(
|
|
t,
|
|
cmds,
|
|
expectChildCount,
|
|
"parent command should have the correct child command count")
|
|
|
|
require.NotNil(t, child, "should have found expected child command")
|
|
|
|
assert.Equal(t, expectShort, child.Short)
|
|
tester.AreSameFunc(t, expectRunE, child.RunE)
|
|
}
|