From 996f79738e6f6c7dc9723cffe2b0bddc267777c6 Mon Sep 17 00:00:00 2001 From: brianpursley Date: Sat, 12 Feb 2022 11:23:35 -0500 Subject: [PATCH] Add unit tests for cluster, context, and user command line completion functions --- .../k8s.io/kubectl/pkg/cmd/testing/fake.go | 6 ++ .../kubectl/pkg/util/completion_test.go | 86 ++++++++++++++++++- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go b/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go index 0fc3c86f3d2..71d483633ba 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/testing/fake.go @@ -446,6 +446,12 @@ func (f *TestFactory) WithNamespace(ns string) *TestFactory { return f } +// WithClientConfig sets the client config to use +func (f *TestFactory) WithClientConfig(clientConfig clientcmd.ClientConfig) *TestFactory { + f.kubeConfigFlags.WithClientConfig(clientConfig) + return f +} + // Cleanup cleans up TestFactory temp config file func (f *TestFactory) Cleanup() { if f.tempConfigFile == nil { diff --git a/staging/src/k8s.io/kubectl/pkg/util/completion_test.go b/staging/src/k8s.io/kubectl/pkg/util/completion_test.go index da94faa99ae..21e95eedc24 100644 --- a/staging/src/k8s.io/kubectl/pkg/util/completion_test.go +++ b/staging/src/k8s.io/kubectl/pkg/util/completion_test.go @@ -22,16 +22,92 @@ import ( "testing" "github.com/spf13/cobra" + "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/rest/fake" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/tools/clientcmd/api" "k8s.io/kubectl/pkg/cmd/get" cmdtesting "k8s.io/kubectl/pkg/cmd/testing" - - // cmdutil "k8s.io/kubectl/pkg/cmd/util" "k8s.io/kubectl/pkg/scheme" ) +func TestClusterCompletionFunc(t *testing.T) { + setMockFactory(api.Config{ + Clusters: map[string]*api.Cluster{ + "bar": {}, + "baz": {}, + "foo": {}, + }, + }) + + comps, directive := ClusterCompletionFunc(nil, []string{}, "") + checkCompletion(t, comps, []string{"bar", "baz", "foo"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ClusterCompletionFunc(nil, []string{}, "b") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ClusterCompletionFunc(nil, []string{}, "ba") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ClusterCompletionFunc(nil, []string{}, "bar") + checkCompletion(t, comps, []string{"bar"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ClusterCompletionFunc(nil, []string{}, "bart") + checkCompletion(t, comps, []string{}, directive, cobra.ShellCompDirectiveNoFileComp) +} + +func TestContextCompletionFunc(t *testing.T) { + setMockFactory(api.Config{ + Contexts: map[string]*api.Context{ + "bar": {}, + "baz": {}, + "foo": {}, + }, + }) + + comps, directive := ContextCompletionFunc(nil, []string{}, "") + checkCompletion(t, comps, []string{"bar", "baz", "foo"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ContextCompletionFunc(nil, []string{}, "b") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ContextCompletionFunc(nil, []string{}, "ba") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ContextCompletionFunc(nil, []string{}, "bar") + checkCompletion(t, comps, []string{"bar"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = ContextCompletionFunc(nil, []string{}, "bart") + checkCompletion(t, comps, []string{}, directive, cobra.ShellCompDirectiveNoFileComp) +} + +func TestUserCompletionFunc(t *testing.T) { + setMockFactory(api.Config{ + AuthInfos: map[string]*api.AuthInfo{ + "bar": {}, + "baz": {}, + "foo": {}, + }, + }) + + comps, directive := UserCompletionFunc(nil, []string{}, "") + checkCompletion(t, comps, []string{"bar", "baz", "foo"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = UserCompletionFunc(nil, []string{}, "b") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = UserCompletionFunc(nil, []string{}, "ba") + checkCompletion(t, comps, []string{"bar", "baz"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = UserCompletionFunc(nil, []string{}, "bar") + checkCompletion(t, comps, []string{"bar"}, directive, cobra.ShellCompDirectiveNoFileComp) + + comps, directive = UserCompletionFunc(nil, []string{}, "bart") + checkCompletion(t, comps, []string{}, directive, cobra.ShellCompDirectiveNoFileComp) +} + func TestResourceTypeAndNameCompletionFuncOneArg(t *testing.T) { tf, cmd := prepareCompletionTest() addPodsToFactory(tf) @@ -134,6 +210,12 @@ func TestPodResourceNameAndContainerCompletionFuncTooManyArgs(t *testing.T) { checkCompletion(t, comps, []string{}, directive, cobra.ShellCompDirectiveNoFileComp) } +func setMockFactory(config api.Config) { + clientConfig := clientcmd.NewDefaultClientConfig(config, nil) + testFactory := cmdtesting.NewTestFactory().WithClientConfig(clientConfig) + SetFactoryForCompletion(testFactory) +} + func prepareCompletionTest() (*cmdtesting.TestFactory, *cobra.Command) { tf := cmdtesting.NewTestFactory().WithNamespace("test") defer tf.Cleanup()