github.com/adevinta/lava@v0.7.2/internal/report/humanprinter_test.go (about)

     1  // Copyright 2023 Adevinta
     2  
     3  package report
     4  
     5  import (
     6  	"bytes"
     7  	"strings"
     8  	"testing"
     9  
    10  	vreport "github.com/adevinta/vulcan-report"
    11  
    12  	"github.com/adevinta/lava/internal/config"
    13  )
    14  
    15  func TestUserFriendlyPrinter_Print(t *testing.T) {
    16  	tests := []struct {
    17  		name            string
    18  		vulnerabilities []vulnerability
    19  		summ            summary
    20  		status          []checkStatus
    21  		want            []string
    22  	}{
    23  		{
    24  			name: "User Friendly Report",
    25  			vulnerabilities: []vulnerability{
    26  				{
    27  					Vulnerability: vreport.Vulnerability{
    28  						Summary: "Vulnerability Summary 1",
    29  						Description: "Lorem ipsum dolor sit amet, " +
    30  							"consectetur adipiscing elit. Nam malesuada " +
    31  							"pretium ligula, ac egestas leo egestas nec. " +
    32  							"Morbi id placerat ipsum. Donec semper enim urna, " +
    33  							"et bibendum ex dictum in. Quisque venenatis " +
    34  							"in sem in lacinia. Fusce lacus odio, molestie " +
    35  							"vitae mi nec, elementum pellentesque augue. " +
    36  							"Aenean imperdiet odio eu sodales molestie. " +
    37  							"Fusce ut elementum leo. Nam sodales molestie " +
    38  							"lorem in rutrum. Pellentesque nec sapien elit. " +
    39  							"Sed tincidunt ut augue sit amet cursus. " +
    40  							"In convallis magna sit amet tempus pellentesque. " +
    41  							"Nam commodo porttitor ante sed volutpat. " +
    42  							"Ut vulputate leo quis ultricies sodales.",
    43  						AffectedResource: "Affected Resource 1",
    44  						ImpactDetails:    "Impact detail 1",
    45  						Recommendations: []string{
    46  							"Recommendation 1",
    47  							"Recommendation 2",
    48  							"Recommendation 3",
    49  						},
    50  						Details: "Vulnerability Detail 1",
    51  						References: []string{
    52  							"Reference 1",
    53  							"Reference 2",
    54  							"Reference 3",
    55  						},
    56  						Resources: []vreport.ResourcesGroup{
    57  							{
    58  								Name: "Resource 1",
    59  								Header: []string{
    60  									"Header 1",
    61  									"Header 2",
    62  									"Header 3",
    63  									"Header 4",
    64  								},
    65  								Rows: []map[string]string{
    66  									{
    67  										"Header 1": "row 11",
    68  										"Header 2": "row 12",
    69  										"Header 3": "row 13",
    70  										"Header 4": "row 14",
    71  									},
    72  									{
    73  										"Header 1": "row 21",
    74  										"Header 2": "row 22",
    75  										"Header 3": "row 23",
    76  										"Header 4": "row 24",
    77  									},
    78  									{
    79  										"Header 1": "row 31",
    80  										"Header 2": "row 32",
    81  										"Header 3": "row 33",
    82  										"Header 4": "row 34",
    83  									},
    84  									{
    85  										"Header 1": "row 41",
    86  										"Header 2": "row 42",
    87  										"Header 3": "row 43",
    88  										"Header 4": "row 44",
    89  									},
    90  								},
    91  							},
    92  							{
    93  								Name: "Resource 2",
    94  								Header: []string{
    95  									"Header 1",
    96  									"Header 2",
    97  								},
    98  								Rows: []map[string]string{
    99  									{
   100  										"Header 1": "row 11",
   101  										"Header 2": "row 12",
   102  									},
   103  									{
   104  										"Header 1": "row 21",
   105  										"Header 2": "row 22",
   106  									},
   107  								},
   108  							},
   109  							{
   110  								Name: "Resource 3",
   111  								Header: []string{
   112  									"Header 1",
   113  									"Header 2",
   114  								},
   115  								Rows: []map[string]string{
   116  									{
   117  										"Header 1": "row 11",
   118  										"Header 2": "row 12",
   119  									},
   120  									{
   121  										"Header 1": "row 21",
   122  										"Header 2": "row 22",
   123  									},
   124  								},
   125  							},
   126  							{
   127  								Name: "Resource 4",
   128  								Header: []string{
   129  									"Header 1",
   130  									"Header 2",
   131  								},
   132  								Rows: []map[string]string{
   133  									{
   134  										"Header 1": "row 11",
   135  										"Header 2": "row 12",
   136  									},
   137  									{
   138  										"Header 1": "row 21",
   139  										"Header 2": "row 22",
   140  									},
   141  								},
   142  							},
   143  						},
   144  					},
   145  					CheckData: vreport.CheckData{
   146  						CheckID: "CheckID1",
   147  						Target:  ".",
   148  					},
   149  				},
   150  			},
   151  			summ: summary{
   152  				count: map[config.Severity]int{
   153  					config.SeverityHigh:   3,
   154  					config.SeverityMedium: 15,
   155  				},
   156  				excluded: 3,
   157  			},
   158  			status: []checkStatus{
   159  				{
   160  					Checktype: "Check1",
   161  					Target:    ".",
   162  					Status:    "FINISHED",
   163  				},
   164  			},
   165  			want: []string{
   166  				"STATUS",
   167  				"FINISHED",
   168  				"SUMMARY",
   169  				"Number of excluded vulnerabilities not included in the summary table: 3",
   170  				"VULNERABILITIES",
   171  				"Vulnerability Summary 1",
   172  			},
   173  		},
   174  		{
   175  			name:            "No vulnerabilities",
   176  			vulnerabilities: nil,
   177  			status: []checkStatus{
   178  				{
   179  					Checktype: "Check1",
   180  					Target:    ".",
   181  					Status:    "FINISHED",
   182  				},
   183  			},
   184  			want: []string{
   185  				"STATUS",
   186  				"FINISHED",
   187  				"SUMMARY",
   188  				"No vulnerabilities found during the scan.",
   189  			},
   190  		},
   191  	}
   192  	for _, tt := range tests {
   193  		t.Run(tt.name, func(t *testing.T) {
   194  			var buf bytes.Buffer
   195  			w := humanPrinter{}
   196  			if err := w.Print(&buf, tt.vulnerabilities, tt.summ, tt.status); err != nil {
   197  				t.Errorf("unexpected error value: %v", err)
   198  			}
   199  			text := buf.String()
   200  
   201  			for _, wantLine := range tt.want {
   202  				if !strings.Contains(text, wantLine) {
   203  					t.Errorf("text not found: %s", wantLine)
   204  				}
   205  			}
   206  		})
   207  	}
   208  }