github.com/anchore/syft@v1.38.2/cmd/syft/internal/options/catalog_test.go (about)

     1  package options
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func TestCatalog_PostLoad(t *testing.T) {
    11  
    12  	tests := []struct {
    13  		name    string
    14  		options Catalog
    15  		assert  func(t *testing.T, options Catalog)
    16  		wantErr assert.ErrorAssertionFunc
    17  	}{
    18  		{
    19  			name: "mutually exclusive cataloger flags (cat / def-cat)",
    20  			options: Catalog{
    21  				Catalogers:        []string{"foo,bar", "42"},
    22  				DefaultCatalogers: []string{"some,thing"},
    23  				Scope:             "squashed",
    24  			},
    25  			wantErr: assert.Error,
    26  		},
    27  		{
    28  			name: "mutually exclusive cataloger flags (cat / sel-cat)",
    29  			options: Catalog{
    30  				Catalogers:       []string{"foo,bar", "42"},
    31  				SelectCatalogers: []string{"some,thing"},
    32  				Scope:            "squashed",
    33  			},
    34  			wantErr: assert.Error,
    35  		},
    36  		{
    37  			name: "allow old cataloger flags",
    38  			options: Catalog{
    39  				Catalogers: []string{"foo,bar"},
    40  				Scope:      "squashed",
    41  			},
    42  			assert: func(t *testing.T, options Catalog) {
    43  				assert.Equal(t, []string{"bar", "foo"}, options.DefaultCatalogers) // note: sorted order
    44  				assert.Equal(t, []string{"bar", "foo"}, options.Catalogers)        // note: sorted order
    45  			},
    46  		},
    47  		{
    48  			name: "allow new cataloger flags",
    49  			options: Catalog{
    50  				SelectCatalogers:  []string{"foo,bar", "42"},
    51  				DefaultCatalogers: []string{"some,thing"},
    52  				Scope:             "squashed",
    53  			},
    54  			assert: func(t *testing.T, options Catalog) {
    55  				assert.Equal(t, []string{"42", "bar", "foo"}, options.SelectCatalogers) // note: sorted order
    56  				assert.Equal(t, []string{"some", "thing"}, options.DefaultCatalogers)   // note: sorted order
    57  				assert.Empty(t, options.Catalogers)
    58  			},
    59  		},
    60  		{
    61  			name: "must have package overlap flag when pruning binaries by overlap",
    62  			options: Catalog{
    63  				Package:       packageConfig{ExcludeBinaryOverlapByOwnership: true},
    64  				Relationships: relationshipsConfig{PackageFileOwnershipOverlap: false},
    65  			},
    66  			wantErr: assert.Error,
    67  		},
    68  	}
    69  	for _, tt := range tests {
    70  		t.Run(tt.name, func(t *testing.T) {
    71  			if tt.wantErr == nil {
    72  				tt.wantErr = assert.NoError
    73  			}
    74  			tt.wantErr(t, tt.options.PostLoad(), fmt.Sprintf("PostLoad()"))
    75  			if tt.assert != nil {
    76  				tt.assert(t, tt.options)
    77  			}
    78  		})
    79  	}
    80  }
    81  
    82  func TestFlatten(t *testing.T) {
    83  	tests := []struct {
    84  		name     string
    85  		input    []string
    86  		expected []string
    87  	}{
    88  		{
    89  			name:     "preserves order of comma-separated values",
    90  			input:    []string{"registry,docker,oci-dir"},
    91  			expected: []string{"registry", "docker", "oci-dir"},
    92  		},
    93  		{
    94  			name:     "preserves order across multiple entries",
    95  			input:    []string{"registry,docker", "oci-dir"},
    96  			expected: []string{"registry", "docker", "oci-dir"},
    97  		},
    98  		{
    99  			name:     "trims whitespace",
   100  			input:    []string{"  registry  ,  docker  ", "  oci-dir  "},
   101  			expected: []string{"registry", "docker", "oci-dir"},
   102  		},
   103  		{
   104  			name:     "handles single value",
   105  			input:    []string{"registry"},
   106  			expected: []string{"registry"},
   107  		},
   108  		{
   109  			name:     "handles empty input",
   110  			input:    []string{},
   111  			expected: nil,
   112  		},
   113  		{
   114  			name:     "preserves reverse alphabetical order",
   115  			input:    []string{"zebra,yankee,xray"},
   116  			expected: []string{"zebra", "yankee", "xray"},
   117  		},
   118  	}
   119  
   120  	for _, tt := range tests {
   121  		t.Run(tt.name, func(t *testing.T) {
   122  			got := Flatten(tt.input)
   123  			assert.Equal(t, tt.expected, got)
   124  		})
   125  	}
   126  }
   127  
   128  func TestFlattenAndSort(t *testing.T) {
   129  	tests := []struct {
   130  		name     string
   131  		input    []string
   132  		expected []string
   133  	}{
   134  		{
   135  			name:     "sorts comma-separated values",
   136  			input:    []string{"registry,docker,oci-dir"},
   137  			expected: []string{"docker", "oci-dir", "registry"},
   138  		},
   139  		{
   140  			name:     "sorts across multiple entries",
   141  			input:    []string{"registry,docker", "oci-dir"},
   142  			expected: []string{"docker", "oci-dir", "registry"},
   143  		},
   144  		{
   145  			name:     "trims whitespace and sorts",
   146  			input:    []string{"  registry  ,  docker  ", "  oci-dir  "},
   147  			expected: []string{"docker", "oci-dir", "registry"},
   148  		},
   149  		{
   150  			name:     "handles single value",
   151  			input:    []string{"registry"},
   152  			expected: []string{"registry"},
   153  		},
   154  		{
   155  			name:     "handles empty input",
   156  			input:    []string{},
   157  			expected: nil,
   158  		},
   159  		{
   160  			name:     "sorts reverse alphabetical order",
   161  			input:    []string{"zebra,yankee,xray"},
   162  			expected: []string{"xray", "yankee", "zebra"},
   163  		},
   164  	}
   165  
   166  	for _, tt := range tests {
   167  		t.Run(tt.name, func(t *testing.T) {
   168  			got := FlattenAndSort(tt.input)
   169  			assert.Equal(t, tt.expected, got)
   170  		})
   171  	}
   172  }
   173  
   174  func Test_enrichmentEnabled(t *testing.T) {
   175  	tests := []struct {
   176  		directives string
   177  		test       string
   178  		expected   *bool
   179  	}{
   180  		{
   181  			directives: "",
   182  			test:       "java",
   183  			expected:   nil,
   184  		},
   185  		{
   186  			directives: "none",
   187  			test:       "java",
   188  			expected:   ptr(false),
   189  		},
   190  		{
   191  			directives: "none,+java",
   192  			test:       "java",
   193  			expected:   ptr(true),
   194  		},
   195  		{
   196  			directives: "all,none",
   197  			test:       "java",
   198  			expected:   ptr(false),
   199  		},
   200  		{
   201  			directives: "all",
   202  			test:       "java",
   203  			expected:   ptr(true),
   204  		},
   205  		{
   206  			directives: "golang,js",
   207  			test:       "java",
   208  			expected:   nil,
   209  		},
   210  		{
   211  			directives: "golang,-js,java",
   212  			test:       "java",
   213  			expected:   ptr(true),
   214  		},
   215  		{
   216  			directives: "golang,js,-java",
   217  			test:       "java",
   218  			expected:   ptr(false),
   219  		},
   220  		{
   221  			directives: "all",
   222  			test:       "java",
   223  			expected:   ptr(true),
   224  		},
   225  		{
   226  			directives: "all,-java",
   227  			test:       "java",
   228  			expected:   ptr(false),
   229  		},
   230  	}
   231  
   232  	for _, test := range tests {
   233  		t.Run(test.directives, func(t *testing.T) {
   234  			got := enrichmentEnabled(FlattenAndSort([]string{test.directives}), test.test)
   235  			assert.Equal(t, test.expected, got)
   236  		})
   237  	}
   238  }