Files
k3k/cli/cmds/completion_test.go
T
Enrico CandinoandGitHub 22f0b9c699 Add completion to --namespace flag (#1049)
* Add completion to `--namespace` flag

* Add namespace completion to policy create command

* Refactor namespace completion functions for consistency across commands

* addressed some comments
2026-07-22 17:11:17 +02:00

96 lines
2.6 KiB
Go

package cmds
import (
"testing"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"github.com/rancher/k3k/pkg/apis/k3k.io/v1beta1"
)
func completionTestScheme(t *testing.T) *runtime.Scheme {
t.Helper()
scheme := runtime.NewScheme()
schemeBuilder := runtime.NewSchemeBuilder(
clientgoscheme.AddToScheme,
v1beta1.AddToScheme,
)
assert.NoError(t, schemeBuilder.AddToScheme(scheme))
return scheme
}
func namespace(name string) *corev1.Namespace {
return &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name}}
}
func cluster(name, ns string) *v1beta1.Cluster {
return &v1beta1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns}}
}
func Test_completeNamespaces(t *testing.T) {
fakeClient := fake.NewClientBuilder().
WithScheme(completionTestScheme(t)).
WithObjects(
namespace("default"),
namespace("k3k-foo"),
namespace("k3k-bar"),
).
Build()
names, directive := namespaceCompletions(&cobra.Command{}, fakeClient)
assert.Equal(t, cobra.ShellCompDirectiveNoFileComp, directive)
assert.ElementsMatch(t, []string{"default", "k3k-foo", "k3k-bar"}, names)
}
func Test_completeNamespaces_excludesSelected(t *testing.T) {
fakeClient := fake.NewClientBuilder().
WithScheme(completionTestScheme(t)).
WithObjects(
namespace("default"),
namespace("k3k-foo"),
namespace("k3k-bar"),
).
Build()
cmd := &cobra.Command{}
cmd.Flags().StringSlice("namespace", nil, "")
assert.NoError(t, cmd.Flags().Set("namespace", "k3k-foo"))
names, directive := namespaceCompletions(cmd, fakeClient)
assert.Equal(t, cobra.ShellCompDirectiveNoFileComp, directive)
// already-selected "k3k-foo" is filtered out
assert.ElementsMatch(t, []string{"default", "k3k-bar"}, names)
}
func Test_completeClusterNamespaces(t *testing.T) {
fakeClient := fake.NewClientBuilder().
WithScheme(completionTestScheme(t)).
WithObjects(
namespace("default"),
namespace("k3k-foo"),
namespace("k3k-bar"),
cluster("foo", "k3k-foo"),
cluster("bar", "k3k-bar"),
// second cluster in the same namespace must be deduped
cluster("bar-2", "k3k-bar"),
).
Build()
names, directive := clusterNamespaceCompletions(t.Context(), fakeClient)
assert.Equal(t, cobra.ShellCompDirectiveNoFileComp, directive)
// only namespaces that contain a cluster, deduplicated; "default" is excluded
assert.ElementsMatch(t, []string{"k3k-foo", "k3k-bar"}, names)
}