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  }