github.com/kastenhq/syft@v0.0.0-20230821225854-0710af25cdbe/syft/formats/common/cyclonedxhelpers/external_references_test.go (about)

     1  package cyclonedxhelpers
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/CycloneDX/cyclonedx-go"
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/kastenhq/syft/syft/pkg"
    10  )
    11  
    12  func Test_encodeExternalReferences(t *testing.T) {
    13  	tests := []struct {
    14  		name     string
    15  		input    pkg.Package
    16  		expected *[]cyclonedx.ExternalReference
    17  	}{
    18  		{
    19  			name:     "no metadata",
    20  			input:    pkg.Package{},
    21  			expected: nil,
    22  		},
    23  		{
    24  			name: "from apk",
    25  			input: pkg.Package{
    26  				Metadata: pkg.ApkMetadata{
    27  					URL: "http://a-place.gov",
    28  				},
    29  			},
    30  			expected: &[]cyclonedx.ExternalReference{
    31  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeDistribution},
    32  			},
    33  		},
    34  		{
    35  			name: "from npm",
    36  			input: pkg.Package{
    37  				Metadata: pkg.NpmPackageJSONMetadata{
    38  					URL: "http://a-place.gov",
    39  				},
    40  			},
    41  			expected: &[]cyclonedx.ExternalReference{
    42  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeDistribution},
    43  			},
    44  		},
    45  		{
    46  			name: "from cargo lock",
    47  			input: pkg.Package{
    48  				Name:         "ansi_term",
    49  				Version:      "0.12.1",
    50  				Language:     pkg.Rust,
    51  				Type:         pkg.RustPkg,
    52  				MetadataType: pkg.RustCargoPackageMetadataType,
    53  				Licenses:     pkg.NewLicenseSet(),
    54  				Metadata: pkg.CargoPackageMetadata{
    55  					Name:     "ansi_term",
    56  					Version:  "0.12.1",
    57  					Source:   "registry+https://github.com/rust-lang/crates.io-index",
    58  					Checksum: "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2",
    59  					Dependencies: []string{
    60  						"winapi",
    61  					},
    62  				},
    63  			},
    64  			expected: &[]cyclonedx.ExternalReference{
    65  				{URL: "registry+https://github.com/rust-lang/crates.io-index", Type: cyclonedx.ERTypeDistribution},
    66  			},
    67  		},
    68  		{
    69  			name: "from npm with homepage",
    70  			input: pkg.Package{
    71  				Metadata: pkg.NpmPackageJSONMetadata{
    72  					URL:      "http://a-place.gov",
    73  					Homepage: "http://homepage",
    74  				},
    75  			},
    76  			expected: &[]cyclonedx.ExternalReference{
    77  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeDistribution},
    78  				{URL: "http://homepage", Type: cyclonedx.ERTypeWebsite},
    79  			},
    80  		},
    81  		{
    82  			name: "from gem",
    83  			input: pkg.Package{
    84  				Metadata: pkg.GemMetadata{
    85  					Homepage: "http://a-place.gov",
    86  				},
    87  			},
    88  			expected: &[]cyclonedx.ExternalReference{
    89  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeWebsite},
    90  			},
    91  		},
    92  		{
    93  			name: "from python direct url",
    94  			input: pkg.Package{
    95  				Metadata: pkg.PythonPackageMetadata{
    96  					DirectURLOrigin: &pkg.PythonDirectURLOriginInfo{
    97  						URL: "http://a-place.gov",
    98  					},
    99  				},
   100  			},
   101  			expected: &[]cyclonedx.ExternalReference{
   102  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeVCS},
   103  			},
   104  		},
   105  		{
   106  			name: "from python direct url with commit",
   107  			input: pkg.Package{
   108  				Metadata: pkg.PythonPackageMetadata{
   109  					DirectURLOrigin: &pkg.PythonDirectURLOriginInfo{
   110  						URL:      "http://a-place.gov",
   111  						CommitID: "test",
   112  					},
   113  				},
   114  			},
   115  			expected: &[]cyclonedx.ExternalReference{
   116  				{URL: "http://a-place.gov", Type: cyclonedx.ERTypeVCS, Comment: "commit: test"},
   117  			},
   118  		},
   119  		{
   120  			name: "empty",
   121  			input: pkg.Package{
   122  				Metadata: pkg.NpmPackageJSONMetadata{
   123  					URL: "",
   124  				},
   125  			},
   126  			expected: nil,
   127  		},
   128  	}
   129  	for _, test := range tests {
   130  		t.Run(test.name, func(t *testing.T) {
   131  			assert.Equal(t, test.expected, encodeExternalReferences(test.input))
   132  		})
   133  	}
   134  }