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 }