github.com/verrazzano/verrazzano@v1.7.0/tools/psr/psrctl/cmd/explain/explain_test.go (about) 1 // Copyright (c) 2022, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package explain 5 6 import ( 7 "bytes" 8 "fmt" 9 "os" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/verrazzano/verrazzano/pkg/k8sutil" 14 "github.com/verrazzano/verrazzano/pkg/log/vzlog" 15 "github.com/verrazzano/verrazzano/tools/psr/psrctl/cmd/constants" 16 "github.com/verrazzano/verrazzano/tools/psr/psrctl/pkg/manifest" 17 "github.com/verrazzano/verrazzano/tools/vz/test/helpers" 18 "k8s.io/cli-runtime/pkg/genericclioptions" 19 k8sfake "k8s.io/client-go/kubernetes/fake" 20 corev1cli "k8s.io/client-go/kubernetes/typed/core/v1" 21 ) 22 23 const psrRoot = "../../.." 24 25 var ( 26 expectedID = "ops-s1" 27 expectedName = "opensearch-s1" 28 expectedDescription = "This is a scenario that writes logs to STDOUT and gets logs from OpenSearch at a moderated rate." 29 expectedUseCase = "Usecase path opensearch/writelogs.yaml: Description: write logs to STDOUT 10 times a second" 30 ) 31 32 // TestExplainScenario tests the NewCmdExplain and RunCmdExplain functions 33 // 34 // WHEN 'psrctl explain -s ops-s1' is called 35 // THEN ensure the output is correct for that scenario 36 func TestExplainScenario(t *testing.T) { 37 manifest.Manifests = &manifest.PsrManifests{ 38 RootTmpDir: psrRoot, 39 WorkerChartAbsDir: psrRoot + "/manifests/charts/worker", 40 UseCasesAbsDir: psrRoot + "/manifests/usecases", 41 ScenarioAbsDir: psrRoot + "/manifests/scenarios", 42 } 43 44 defer manifest.ResetManifests() 45 46 defer func() { k8sutil.GetCoreV1Func = k8sutil.GetCoreV1Client }() 47 k8sutil.GetCoreV1Func = func(log ...vzlog.VerrazzanoLogger) (corev1cli.CoreV1Interface, error) { 48 return k8sfake.NewSimpleClientset().CoreV1(), nil 49 } 50 51 // Send the command output to a byte buffer 52 buf := new(bytes.Buffer) 53 errBuf := new(bytes.Buffer) 54 rc := helpers.NewFakeRootCmdContext(genericclioptions.IOStreams{In: os.Stdin, Out: buf, ErrOut: errBuf}) 55 56 explainCmd := NewCmdExplain(rc) 57 explainCmd.PersistentFlags().Set(constants.FlagScenario, "ops-s1") 58 explainCmd.PersistentFlags().Set(constants.FlagNamespace, "psr") 59 assert.NotNil(t, explainCmd) 60 61 // Run explain command, check for the expected status results to be displayed 62 err := explainCmd.Execute() 63 assert.NoError(t, err) 64 result := buf.String() 65 assert.Contains(t, result, fmt.Sprintf("ID: %s", expectedID)) 66 assert.Contains(t, result, fmt.Sprintf("Name: %s", expectedName)) 67 assert.Contains(t, result, fmt.Sprintf("Description: %s", expectedDescription)) 68 assert.NotContains(t, result, "ID: ops-s9") 69 assert.NotContains(t, result, fmt.Sprintf("Use cases: %s", expectedUseCase)) 70 } 71 72 // TestExplainScenarioVerbose tests the NewCmdExplain and RunCmdExplain functions 73 // 74 // WHEN 'psrctl explain -s ops-s1 -v' is called 75 // THEN ensure the output includes the verbose usecases 76 func TestExplainScenarioVerbose(t *testing.T) { 77 manifest.Manifests = &manifest.PsrManifests{ 78 RootTmpDir: psrRoot, 79 WorkerChartAbsDir: psrRoot + "/manifests/charts/worker", 80 UseCasesAbsDir: psrRoot + "/manifests/usecases", 81 ScenarioAbsDir: psrRoot + "/manifests/scenarios", 82 } 83 84 defer manifest.ResetManifests() 85 86 defer func() { k8sutil.GetCoreV1Func = k8sutil.GetCoreV1Client }() 87 k8sutil.GetCoreV1Func = func(log ...vzlog.VerrazzanoLogger) (corev1cli.CoreV1Interface, error) { 88 return k8sfake.NewSimpleClientset().CoreV1(), nil 89 } 90 91 // Send the command output to a byte buffer 92 buf := new(bytes.Buffer) 93 errBuf := new(bytes.Buffer) 94 rc := helpers.NewFakeRootCmdContext(genericclioptions.IOStreams{In: os.Stdin, Out: buf, ErrOut: errBuf}) 95 96 explainCmd := NewCmdExplain(rc) 97 explainCmd.PersistentFlags().Set(constants.FlagScenario, "ops-s1") 98 explainCmd.PersistentFlags().Set(constants.FlagNamespace, "psr") 99 explainCmd.PersistentFlags().Set(constants.FlagVerbose, "true") 100 assert.NotNil(t, explainCmd) 101 102 // Run explain command, check for the expected status results to be displayed 103 err := explainCmd.Execute() 104 assert.NoError(t, err) 105 result := buf.String() 106 assert.Contains(t, result, fmt.Sprintf("ID: %s", expectedID)) 107 assert.Contains(t, result, fmt.Sprintf("Name: %s", expectedName)) 108 assert.Contains(t, result, fmt.Sprintf("Description: %s", expectedDescription)) 109 assert.Contains(t, result, fmt.Sprintf("Use cases:\n%s", expectedUseCase)) 110 assert.NotContains(t, result, "ID: ops-s9") 111 } 112 113 // TestExplainNoScenario tests the NewCmdExplain and RunCmdExplain functions 114 // 115 // WHEN 'psrctl explain' is called 116 // THEN ensure the output correctly lists all scenarios 117 func TestExplainNoScenario(t *testing.T) { 118 manifest.Manifests = &manifest.PsrManifests{ 119 RootTmpDir: psrRoot, 120 WorkerChartAbsDir: psrRoot + "/manifests/charts/worker", 121 UseCasesAbsDir: psrRoot + "/manifests/usecases", 122 ScenarioAbsDir: psrRoot + "/manifests/scenarios", 123 } 124 125 defer manifest.ResetManifests() 126 127 defer func() { k8sutil.GetCoreV1Func = k8sutil.GetCoreV1Client }() 128 k8sutil.GetCoreV1Func = func(log ...vzlog.VerrazzanoLogger) (corev1cli.CoreV1Interface, error) { 129 return k8sfake.NewSimpleClientset().CoreV1(), nil 130 } 131 132 // Send the command output to a byte buffer 133 buf := new(bytes.Buffer) 134 errBuf := new(bytes.Buffer) 135 rc := helpers.NewFakeRootCmdContext(genericclioptions.IOStreams{In: os.Stdin, Out: buf, ErrOut: errBuf}) 136 137 explainCmd := NewCmdExplain(rc) 138 assert.NotNil(t, explainCmd) 139 140 // Run explain command, check for all scenarios to be listed 141 err := explainCmd.Execute() 142 assert.NoError(t, err) 143 result := buf.String() 144 assert.Contains(t, result, "ID: ops-s9") 145 assert.Contains(t, result, "Name: opensearch-s9") 146 assert.Contains(t, result, "Description: This is a scenario that combines all of the existing OpenSearch use cases") 147 assert.Contains(t, result, "Namespace needs to be labeled with istio-injection=enabled") 148 assert.NotContains(t, result, fmt.Sprintf("Use cases: %s", expectedUseCase)) 149 }