github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/flag/scan_flags_test.go (about)

     1  package flag_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/spf13/viper"
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/devseccon/trivy/pkg/flag"
    11  	"github.com/devseccon/trivy/pkg/types"
    12  )
    13  
    14  func TestScanFlagGroup_ToOptions(t *testing.T) {
    15  	type fields struct {
    16  		skipDirs    []string
    17  		skipFiles   []string
    18  		offlineScan bool
    19  		scanners    string
    20  	}
    21  	tests := []struct {
    22  		name      string
    23  		args      []string
    24  		fields    fields
    25  		want      flag.ScanOptions
    26  		assertion require.ErrorAssertionFunc
    27  	}{
    28  		{
    29  			name:   "happy path",
    30  			args:   []string{"alpine:latest"},
    31  			fields: fields{},
    32  			want: flag.ScanOptions{
    33  				Target: "alpine:latest",
    34  			},
    35  			assertion: require.NoError,
    36  		},
    37  		{
    38  			name: "happy path for configs",
    39  			args: []string{"alpine:latest"},
    40  			fields: fields{
    41  				scanners: "misconfig",
    42  			},
    43  			want: flag.ScanOptions{
    44  				Target:   "alpine:latest",
    45  				Scanners: types.Scanners{types.MisconfigScanner},
    46  			},
    47  			assertion: require.NoError,
    48  		},
    49  		{
    50  			name:      "without target (args)",
    51  			args:      []string{},
    52  			fields:    fields{},
    53  			want:      flag.ScanOptions{},
    54  			assertion: require.NoError,
    55  		},
    56  		{
    57  			name: "with two or more targets (args)",
    58  			args: []string{
    59  				"alpine:latest",
    60  				"nginx:latest",
    61  			},
    62  			fields:    fields{},
    63  			want:      flag.ScanOptions{},
    64  			assertion: require.NoError,
    65  		},
    66  		{
    67  			name: "skip two files",
    68  			fields: fields{
    69  				skipFiles: []string{
    70  					"file1",
    71  					"file2",
    72  				},
    73  			},
    74  			want: flag.ScanOptions{
    75  				SkipFiles: []string{
    76  					"file1",
    77  					"file2",
    78  				},
    79  			},
    80  			assertion: require.NoError,
    81  		},
    82  		{
    83  			name: "skip two folders",
    84  			fields: fields{
    85  				skipDirs: []string{
    86  					"dir1",
    87  					"dir2",
    88  				},
    89  			},
    90  			want: flag.ScanOptions{
    91  				SkipDirs: []string{
    92  					"dir1",
    93  					"dir2",
    94  				},
    95  			},
    96  			assertion: require.NoError,
    97  		},
    98  		{
    99  			name: "offline scan",
   100  			fields: fields{
   101  				offlineScan: true,
   102  			},
   103  			want: flag.ScanOptions{
   104  				OfflineScan: true,
   105  			},
   106  			assertion: require.NoError,
   107  		},
   108  	}
   109  
   110  	for _, tt := range tests {
   111  		t.Run(tt.name, func(t *testing.T) {
   112  			viper.Set(flag.SkipDirsFlag.ConfigName, tt.fields.skipDirs)
   113  			viper.Set(flag.SkipFilesFlag.ConfigName, tt.fields.skipFiles)
   114  			viper.Set(flag.OfflineScanFlag.ConfigName, tt.fields.offlineScan)
   115  			viper.Set(flag.ScannersFlag.ConfigName, tt.fields.scanners)
   116  
   117  			// Assert options
   118  			f := &flag.ScanFlagGroup{
   119  				SkipDirs:    &flag.SkipDirsFlag,
   120  				SkipFiles:   &flag.SkipFilesFlag,
   121  				OfflineScan: &flag.OfflineScanFlag,
   122  				Scanners:    &flag.ScannersFlag,
   123  			}
   124  
   125  			got, err := f.ToOptions(tt.args)
   126  			tt.assertion(t, err)
   127  			assert.Equalf(t, tt.want, got, "ToOptions()")
   128  		})
   129  
   130  	}
   131  }