github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/syft/pkg/relationships_test.go (about) 1 package pkg 2 3 import ( 4 "testing" 5 6 "github.com/anchore/syft/syft/artifact" 7 ) 8 9 func TestSortRelationships(t *testing.T) { 10 rxjs := Package{ 11 Name: "rxjs", 12 Version: "7.5.0", 13 FoundBy: "javascript-cataloger", 14 PURL: "pkg:npm/rxjs@7.5.0", 15 Language: JavaScript, 16 Type: NpmPkg, 17 MetadataType: NpmPackageLockJSONMetadataType, 18 } 19 testApp := Package{ 20 Name: "test-app", 21 Version: "0.0.0", 22 FoundBy: "javascript-cataloger", 23 PURL: "pkg:npm/test-app@0.0.0", 24 Language: JavaScript, 25 Type: NpmPkg, 26 MetadataType: NpmPackageLockJSONMetadataType, 27 } 28 tslib := Package{ 29 Name: "tslib", 30 Version: "2.6.2", 31 FoundBy: "javascript-cataloger", 32 PURL: "pkg:npm/tslib@2.6.2", 33 Language: JavaScript, 34 Type: NpmPkg, 35 MetadataType: NpmPackageLockJSONMetadataType, 36 } 37 typescript := Package{ 38 Name: "typescript", 39 Version: "4.7.4", 40 FoundBy: "javascript-cataloger", 41 PURL: "pkg:npm/typescript@4.7.4", 42 Language: JavaScript, 43 Type: NpmPkg, 44 MetadataType: NpmPackageLockJSONMetadataType, 45 } 46 zonejs := Package{ 47 Name: "zone.js", 48 Version: "0.11.8", 49 FoundBy: "javascript-cataloger", 50 PURL: "pkg:npm/zone.js@0.11.8", 51 Language: JavaScript, 52 Type: NpmPkg, 53 MetadataType: NpmPackageLockJSONMetadataType, 54 } 55 56 tests := []struct { 57 name string 58 input []artifact.Relationship 59 expected []artifact.Relationship 60 }{ 61 { 62 name: "basic sort", 63 input: []artifact.Relationship{ 64 { 65 From: testApp, 66 To: zonejs, 67 Type: artifact.DependencyOfRelationship, 68 Data: nil, 69 }, 70 { 71 From: testApp, 72 To: rxjs, 73 Type: artifact.DependencyOfRelationship, 74 Data: nil, 75 }, 76 { 77 From: testApp, 78 To: tslib, 79 Type: artifact.DependencyOfRelationship, 80 Data: nil, 81 }, 82 { 83 From: testApp, 84 To: typescript, 85 Type: artifact.DependencyOfRelationship, 86 Data: nil, 87 }, 88 { 89 From: zonejs, 90 To: tslib, 91 Type: artifact.DependencyOfRelationship, 92 Data: nil, 93 }, 94 { 95 From: rxjs, 96 To: tslib, 97 Type: artifact.DependencyOfRelationship, 98 Data: nil, 99 }, 100 }, 101 expected: []artifact.Relationship{ 102 { 103 From: rxjs, 104 To: tslib, 105 Type: artifact.DependencyOfRelationship, 106 Data: nil, 107 }, 108 { 109 From: testApp, 110 To: rxjs, 111 Type: artifact.DependencyOfRelationship, 112 Data: nil, 113 }, 114 { 115 From: testApp, 116 To: tslib, 117 Type: artifact.DependencyOfRelationship, 118 Data: nil, 119 }, 120 { 121 From: testApp, 122 To: typescript, 123 Type: artifact.DependencyOfRelationship, 124 Data: nil, 125 }, 126 { 127 From: testApp, 128 To: zonejs, 129 Type: artifact.DependencyOfRelationship, 130 Data: nil, 131 }, 132 { 133 From: zonejs, 134 To: tslib, 135 Type: artifact.DependencyOfRelationship, 136 Data: nil, 137 }, 138 }, 139 }, 140 } 141 142 for _, tt := range tests { 143 t.Run(tt.name, func(t *testing.T) { 144 SortRelationships(tt.input) 145 for i, got := range tt.input { 146 if !compareRelationships(got, tt.expected[i]) { 147 t.Errorf("Expected %v, got %v", tt.expected[i], got) 148 } 149 } 150 }) 151 } 152 } 153 154 func compareRelationships(a, b artifact.Relationship) bool { 155 aFrom, ok1 := a.From.(Package) 156 bFrom, ok2 := b.From.(Package) 157 aTo, ok3 := a.To.(Package) 158 bTo, ok4 := b.To.(Package) 159 160 if !(ok1 && ok2 && ok3 && ok4) { 161 return false 162 } 163 164 return aFrom.Name == bFrom.Name && 165 aFrom.Version == bFrom.Version && 166 aTo.Name == bTo.Name && 167 aTo.Version == bTo.Version && 168 a.Type == b.Type 169 }