github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/cmd/clusterdefinition/list_component_test.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package clusterdefinition 21 22 import ( 23 "bytes" 24 "fmt" 25 "net/http" 26 27 . "github.com/onsi/ginkgo/v2" 28 . "github.com/onsi/gomega" 29 30 "github.com/spf13/cobra" 31 "k8s.io/apimachinery/pkg/runtime" 32 "k8s.io/apimachinery/pkg/runtime/schema" 33 "k8s.io/cli-runtime/pkg/genericiooptions" 34 "k8s.io/cli-runtime/pkg/resource" 35 clientfake "k8s.io/client-go/rest/fake" 36 cmdtesting "k8s.io/kubectl/pkg/cmd/testing" 37 "k8s.io/kubectl/pkg/scheme" 38 39 appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1" 40 "github.com/1aal/kubeblocks/pkg/cli/list" 41 "github.com/1aal/kubeblocks/pkg/cli/testing" 42 "github.com/1aal/kubeblocks/pkg/cli/types" 43 ) 44 45 var _ = Describe("clusterdefinition list components", func() { 46 var ( 47 cmd *cobra.Command 48 streams genericiooptions.IOStreams 49 out *bytes.Buffer 50 tf *cmdtesting.TestFactory 51 ) 52 53 const ( 54 namespace = testing.Namespace 55 clusterdefinitionName = testing.ClusterDefName 56 ) 57 58 mockClient := func(data runtime.Object) *cmdtesting.TestFactory { 59 tf := testing.NewTestFactory(namespace) 60 codec := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) 61 tf.UnstructuredClient = &clientfake.RESTClient{ 62 NegotiatedSerializer: resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer, 63 GroupVersion: schema.GroupVersion{Group: types.AppsAPIGroup, Version: types.AppsAPIVersion}, 64 Resp: &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, data)}, 65 } 66 tf.Client = tf.UnstructuredClient 67 tf.FakeDynamicClient = testing.FakeDynamicClient(data) 68 return tf 69 } 70 71 BeforeEach(func() { 72 _ = appsv1alpha1.AddToScheme(scheme.Scheme) 73 clusterDef := testing.FakeClusterDef() 74 tf = mockClient(clusterDef) 75 streams, _, out, _ = genericiooptions.NewTestIOStreams() 76 cmd = NewListComponentsCmd(tf, streams) 77 }) 78 79 AfterEach(func() { 80 tf.Cleanup() 81 }) 82 83 It("create list-components cmd", func() { 84 cmd := NewListComponentsCmd(tf, streams) 85 Expect(cmd).ShouldNot(BeNil()) 86 }) 87 88 It("list-components requires a clusterdefinition Name", func() { 89 Expect(validate([]string{})).Should(HaveOccurred()) 90 }) 91 92 It("cd list-components when the cd do not exist", func() { 93 o := list.NewListOptions(tf, streams, types.ClusterDefGVR()) 94 o.AllNamespaces = true 95 codec := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...) 96 tf.UnstructuredClient = &clientfake.RESTClient{ 97 NegotiatedSerializer: resource.UnstructuredPlusDefaultContentConfig().NegotiatedSerializer, 98 GroupVersion: schema.GroupVersion{Group: types.AppsAPIGroup, Version: types.AppsAPIVersion}, 99 Resp: &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, testing.FakeResourceNotFound(types.ClusterDefGVR(), clusterdefinitionName+"-no-exist"))}, 100 } 101 Expect(listComponents(o)).Should(HaveOccurred()) 102 103 }) 104 105 It("list-components", func() { 106 cmd.Run(cmd, []string{clusterdefinitionName}) 107 expected := `NAME WORKLOAD-TYPE CHARACTER-TYPE CLUSTER-DEFINITION IS-MAIN 108 fake-component-type mysql fake-cluster-definition true 109 fake-component-type-1 mysql fake-cluster-definition false 110 ` 111 Expect(expected).Should(Equal(out.String())) 112 fmt.Println(out.String()) 113 }) 114 })