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 }