cli/pkg/cmd/completion/completion_test.go
Mislav Marohnić 2139e763fb Write Cobra deprecation messages to stderr
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`.
2022-05-23 20:23:42 +02:00

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())
}
})
}
}