github.com/verrazzano/verrazzano@v1.7.1/tools/vz/pkg/internal/util/report/report_test.go (about)

     1  // Copyright (c) 2021, 2024, 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  package report
     4  
     5  import (
     6  	"bytes"
     7  	"os"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/verrazzano/verrazzano/tools/vz/pkg/constants"
    13  	"github.com/verrazzano/verrazzano/tools/vz/pkg/helpers"
    14  	"github.com/verrazzano/verrazzano/tools/vz/pkg/internal/util/files"
    15  	"github.com/verrazzano/verrazzano/tools/vz/pkg/internal/util/log"
    16  	help "github.com/verrazzano/verrazzano/tools/vz/test/helpers"
    17  	"k8s.io/cli-runtime/pkg/genericclioptions"
    18  )
    19  
    20  var testSlice = []string{"s1", "s2"}
    21  
    22  // TestInvalidIssues Tests the helpers with invalid issues
    23  // GIVEN a call to helper
    24  // WHEN with an invalid issue
    25  // THEN the appropriate error is returned
    26  // WHEN with a valid issue
    27  // THEN no error is returned
    28  func TestInvalidIssues(t *testing.T) {
    29  	logger := log.GetDebugEnabledLogger()
    30  
    31  	// We start with a custom issue which is created without being populated. This is
    32  	// invalid as there are a few fields which are required
    33  	var invalidIssue = Issue{}
    34  	invalidIssue.Informational = true
    35  	// This will fail as there is no Type specified
    36  	err := ContributeIssue(logger, invalidIssue)
    37  	assert.NotNil(t, err)
    38  	logger.Debugf("Err was", err)
    39  	assert.True(t, strings.Contains(err.Error(), "Type"))
    40  
    41  	// Next set the Type on the issue, it should then complain that no Source is specified
    42  	invalidIssue.Type = "MyIssueType"
    43  	err = ContributeIssue(logger, invalidIssue)
    44  	assert.NotNil(t, err)
    45  	logger.Debugf("Err was", err)
    46  	assert.True(t, strings.Contains(err.Error(), "Source"))
    47  
    48  	// Next set the Source on the issue, it should then complain that no Summary is specified
    49  	invalidIssue.Source = "MyIssueSource"
    50  	err = ContributeIssue(logger, invalidIssue)
    51  	assert.NotNil(t, err)
    52  	logger.Debugf("Err was", err)
    53  	assert.True(t, strings.Contains(err.Error(), "Summary"))
    54  
    55  	// Next set the summary but also set a confidence to a value out of range
    56  	invalidIssue.Summary = "MyIssueSummary"
    57  	invalidIssue.Confidence = 11
    58  	err = ContributeIssue(logger, invalidIssue)
    59  	assert.NotNil(t, err)
    60  	logger.Debugf("Err was", err)
    61  	assert.True(t, strings.Contains(err.Error(), "Confidence"))
    62  
    63  	// to get no issues, set the actions and confidence to a value in range
    64  	invalidIssue.Actions = []Action{{Summary: invalidIssue.Summary}}
    65  	invalidIssue.Confidence = 10
    66  	invalidIssue.Impact = 10
    67  	invalidIssue.Actions = []Action{{Summary: invalidIssue.Summary, Links: testSlice, Steps: testSlice}}
    68  	invalidIssue.SupportingData = []SupportData{{Messages: testSlice, JSONPaths: []JSONPath{{"file", "path"}}, RelatedFiles: testSlice, TextMatches: []files.TextMatch{{FileName: "file", FileLine: 1, MatchedText: "mt"}}}}
    69  	assert.Nil(t, ContributeIssue(logger, invalidIssue))
    70  
    71  	// to get no issues from contribute issues map
    72  	assert.Nil(t, ContributeIssuesMap(logger, "MyIssueSource", map[string]Issue{"issue": invalidIssue}))
    73  	assert.NotEmpty(t, GetAllSourcesFilteredIssues(logger, true, 8, 8))
    74  	AddSourceAnalyzed(invalidIssue.Source)
    75  
    76  	// Send stdout stderr to a byte buffer
    77  	buf := new(bytes.Buffer)
    78  	errBuf := new(bytes.Buffer)
    79  	rc := help.NewFakeRootCmdContext(genericclioptions.IOStreams{In: os.Stdin, Out: buf, ErrOut: errBuf})
    80  	reportCtx := helpers.ReportCtx{ReportFile: "report", ReportFormat: constants.SummaryReport, IncludeSupportData: true, IncludeInfo: true, IncludeActions: true, MinConfidence: 8, MinImpact: 8, PrintReportToConsole: true}
    81  	assert.NoError(t, GenerateHumanReport(logger, rc, reportCtx))
    82  	assert.FileExists(t, "report")
    83  	os.Remove("report")
    84  }
    85  
    86  // We start with a custom issue which is created without being populated. This is
    87  // valid as there are a few fields which are required
    88  // this is mostly concerned for testing the de duplicates of issues
    89  // issue 2 and 3 are same and unlike to issue 1
    90  // filter issues must have 2 issues post filter
    91  
    92  func TestFilterReportIssues(t *testing.T) {
    93  	logger := log.GetDebugEnabledLogger()
    94  
    95  	var validIssues = make([]Issue, 3)
    96  	validIssues[0].Type = "ISSUE 1"
    97  	validIssues[0].Summary = "Test Summary 1"
    98  	validIssues[0].Actions = []Action{{Summary: "Test Summary 1", Links: testSlice, Steps: testSlice}}
    99  	validIssues[0].Source = "Test Source 1"
   100  	validIssues[0].Impact = 10
   101  	validIssues[0].Confidence = 10
   102  
   103  	validIssues[1] = validIssues[0]
   104  	validIssues[1].Type = "ISSUE 2"
   105  	validIssues[1].Summary = constants.SummaryReport
   106  	validIssues[1].Actions[0].Summary = constants.SummaryReport
   107  	validIssues[1].Source = "Test Source 2"
   108  
   109  	validIssues[2] = validIssues[1]
   110  
   111  	filteredIssue := filterReportIssues(logger, validIssues, false, 7, 8)
   112  	assert.Len(t, filteredIssue, 2, "duplicate issues must be filtered out")
   113  }