We used to do the equivalent of `rootCmd.SetOut(os.Stdout)` because we thought that Cobra's "Out" stream represents standard output. However, upon closer inspection it turns out that this is Cobra's stream for usage errors and deprecation warnings, and those we want written to stderr as well. It is not clear to me why Cobra maintains a distinction between "Out" and "Err" streams since both seem to go to sdterr by default. This change also ceases our usage of `command.Print()` functions in favor of explicitly writing to `IOStreams.Out/ErrOut`.
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package completion
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/cli/cli/v2/pkg/iostreams"
|
|
"github.com/google/shlex"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func TestNewCmdCompletion(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
args string
|
|
wantOut string
|
|
wantErr string
|
|
}{
|
|
{
|
|
name: "no arguments",
|
|
args: "completion",
|
|
wantOut: "complete -o default -F __start_gh gh",
|
|
},
|
|
{
|
|
name: "zsh completion",
|
|
args: "completion -s zsh",
|
|
wantOut: "#compdef _gh gh",
|
|
},
|
|
{
|
|
name: "fish completion",
|
|
args: "completion -s fish",
|
|
wantOut: "complete -c gh ",
|
|
},
|
|
{
|
|
name: "PowerShell completion",
|
|
args: "completion -s powershell",
|
|
wantOut: "Register-ArgumentCompleter",
|
|
},
|
|
{
|
|
name: "unsupported shell",
|
|
args: "completion -s csh",
|
|
wantErr: "invalid argument \"csh\" for \"-s, --shell\" flag: valid values are {bash|zsh|fish|powershell}",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
ios, _, stdout, stderr := iostreams.Test()
|
|
completeCmd := NewCmdCompletion(ios)
|
|
rootCmd := &cobra.Command{Use: "gh"}
|
|
rootCmd.AddCommand(completeCmd)
|
|
|
|
argv, err := shlex.Split(tt.args)
|
|
if err != nil {
|
|
t.Fatalf("argument splitting error: %v", err)
|
|
}
|
|
rootCmd.SetArgs(argv)
|
|
rootCmd.SetOut(stderr)
|
|
rootCmd.SetErr(stderr)
|
|
|
|
_, err = rootCmd.ExecuteC()
|
|
if tt.wantErr != "" {
|
|
if err == nil || err.Error() != tt.wantErr {
|
|
t.Fatalf("expected error %q, got %q", tt.wantErr, err)
|
|
}
|
|
return
|
|
}
|
|
if err != nil {
|
|
t.Fatalf("error executing command: %v", err)
|
|
}
|
|
|
|
if !strings.Contains(stdout.String(), tt.wantOut) {
|
|
t.Errorf("completion output did not match:\n%s", stdout.String())
|
|
}
|
|
if len(stderr.String()) > 0 {
|
|
t.Errorf("expected nothing on stderr, got %q", stderr.String())
|
|
}
|
|
})
|
|
}
|
|
}
|