github.com/adevinta/lava@v0.7.2/internal/report/jsonprinter_test.go (about) 1 // Copyright 2023 Adevinta 2 3 package report 4 5 import ( 6 "bytes" 7 "encoding/json" 8 "testing" 9 10 vreport "github.com/adevinta/vulcan-report" 11 "github.com/google/go-cmp/cmp" 12 ) 13 14 func TestJsonPrinter_Print(t *testing.T) { 15 tests := []struct { 16 name string 17 vulnerabilities []vulnerability 18 wantNilErr bool 19 }{ 20 { 21 name: "Standard Output JSON Report", 22 vulnerabilities: []vulnerability{ 23 { 24 Vulnerability: vreport.Vulnerability{ 25 Summary: "Vulnerability Summary 1", 26 Description: "Lorem ipsum dolor sit amet, " + 27 "consectetur adipiscing elit. Nam malesuada " + 28 "pretium ligula, ac egestas leo egestas nec. " + 29 "Morbi id placerat ipsum. Donec semper enim urna, " + 30 "et bibendum ex dictum in. Quisque venenatis " + 31 "in sem in lacinia. Fusce lacus odio, molestie " + 32 "vitae mi nec, elementum pellentesque augue. " + 33 "Aenean imperdiet odio eu sodales molestie. " + 34 "Fusce ut elementum leo. Nam sodales molestie " + 35 "lorem in rutrum. Pellentesque nec sapien elit. " + 36 "Sed tincidunt ut augue sit amet cursus. " + 37 "In convallis magna sit amet tempus pellentesque. " + 38 "Nam commodo porttitor ante sed volutpat. " + 39 "Ut vulputate leo quis ultricies sodales.", 40 AffectedResource: "Affected Resource 1", 41 ImpactDetails: "Impact detail 1", 42 Recommendations: []string{ 43 "Recommendation 1", 44 "Recommendation 2", 45 "Recommendation 3", 46 }, 47 Details: "Vulnerability Detail 1", 48 References: []string{ 49 "Reference 1", 50 "Reference 2", 51 "Reference 3", 52 }, 53 Resources: []vreport.ResourcesGroup{ 54 { 55 Name: "Resource 1", 56 Header: []string{ 57 "Header 1", 58 "Header 2", 59 "Header 3", 60 "Header 4", 61 }, 62 Rows: []map[string]string{ 63 { 64 "Header 1": "row 11", 65 "Header 2": "row 12", 66 "Header 3": "row 13", 67 "Header 4": "row 14", 68 }, 69 { 70 "Header 1": "row 21", 71 "Header 2": "row 22", 72 "Header 3": "row 23", 73 "Header 4": "row 24", 74 }, 75 { 76 "Header 1": "row 31", 77 "Header 2": "row 32", 78 "Header 3": "row 33", 79 "Header 4": "row 34", 80 }, 81 { 82 "Header 1": "row 41", 83 "Header 2": "row 42", 84 "Header 3": "row 43", 85 "Header 4": "row 44", 86 }, 87 }, 88 }, 89 { 90 Name: "Resource 2", 91 Header: []string{ 92 "Header 1", 93 "Header 2", 94 }, 95 Rows: []map[string]string{ 96 { 97 "Header 1": "row 11", 98 "Header 2": "row 12", 99 }, 100 { 101 "Header 1": "row 21", 102 "Header 2": "row 22", 103 }, 104 }, 105 }, 106 { 107 Name: "Resource 3", 108 Header: []string{ 109 "Header 1", 110 "Header 2", 111 }, 112 Rows: []map[string]string{ 113 { 114 "Header 1": "row 11", 115 "Header 2": "row 12", 116 }, 117 { 118 "Header 1": "row 21", 119 "Header 2": "row 22", 120 }, 121 }, 122 }, 123 { 124 Name: "Resource 4", 125 Header: []string{ 126 "Header 1", 127 "Header 2", 128 }, 129 Rows: []map[string]string{ 130 { 131 "Header 1": "row 11", 132 "Header 2": "row 12", 133 }, 134 { 135 "Header 1": "row 21", 136 "Header 2": "row 22", 137 }, 138 }, 139 }, 140 }, 141 }, 142 CheckData: vreport.CheckData{ 143 CheckID: "CheckID1", 144 }, 145 }, 146 }, 147 wantNilErr: true, 148 }, 149 { 150 name: "No vulnerabilities", 151 vulnerabilities: []vulnerability{ 152 { 153 Vulnerability: vreport.Vulnerability{}, 154 CheckData: vreport.CheckData{ 155 CheckID: "CheckID1", 156 }, 157 }, 158 }, 159 wantNilErr: true, 160 }, 161 } 162 for _, tt := range tests { 163 t.Run(tt.name, func(t *testing.T) { 164 var buf bytes.Buffer 165 w := jsonPrinter{} 166 err := w.Print(&buf, tt.vulnerabilities, summary{}, nil) 167 if (err == nil) != tt.wantNilErr { 168 t.Errorf("unexpected error value: %v", err) 169 } 170 171 var got []vulnerability 172 if err = json.Unmarshal(buf.Bytes(), &got); err != nil { 173 t.Errorf("unmarshal json report: %v", err) 174 } 175 diffOpts := []cmp.Option{ 176 cmp.AllowUnexported(vulnerability{}), 177 } 178 if diff := cmp.Diff(tt.vulnerabilities, got, diffOpts...); diff != "" { 179 t.Errorf("vulnerabilities mismatch (-want +got):\n%v", diff) 180 } 181 }) 182 } 183 }