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",
|
|
},
|
|
{
|
|
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())
|
|
}
|
|
})
|
|
}
|
|
}
|