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  }