github.com/jfrog/jfrog-cli-core@v1.12.1/artifactory/utils/dotnet/dependencies/packagesconfig_test.go (about) 1 package dependencies 2 3 import ( 4 "encoding/xml" 5 "github.com/jfrog/jfrog-cli-core/utils/log" 6 "github.com/jfrog/jfrog-client-go/artifactory/buildinfo" 7 "path/filepath" 8 "reflect" 9 "sort" 10 "testing" 11 ) 12 13 func getAllDependencies(dependencies map[string][]string) map[string]*buildinfo.Dependency { 14 allDependencies := map[string]*buildinfo.Dependency{} 15 for id := range dependencies { 16 allDependencies[id] = &buildinfo.Dependency{Id: id} 17 } 18 return allDependencies 19 } 20 21 func TestGetRootDependencies(t *testing.T) { 22 tests := []struct { 23 name string 24 dependencies map[string][]string 25 expected []string 26 }{ 27 {"simple1", map[string][]string{"a": {"b", "c"}, "b": {}, "c": {}}, []string{"a"}}, 28 {"simple2", map[string][]string{"a": {}, "b": {}, "c": {}}, []string{"a", "b", "c"}}, 29 {"simple3", map[string][]string{"a": {"b"}, "b": {}, "c": {}}, []string{"a", "c"}}, 30 {"simple4", map[string][]string{"a": {"b"}, "b": {}, "c": {"d"}, "d": {}}, []string{"a", "c"}}, 31 {"simple5", map[string][]string{"a": {"c"}, "b": {"c"}, "c": {"d", "e"}, "d": {}, "e": {}}, []string{"a", "b"}}, 32 {"nonexisting", map[string][]string{"a": {"nonexisting"}}, []string{"a"}}, 33 {"circular1", map[string][]string{"a": {"b", "c"}, "b": {}, "c": {"a"}}, []string{"a", "c"}}, 34 {"circular2", map[string][]string{"a": {"b"}, "b": {"c"}, "c": {"a"}}, []string{"a", "b", "c"}}, 35 {"circular3", map[string][]string{"a": {"b"}, "b": {"c"}, "c": {"a"}, "d": {"a"}}, []string{"a", "b", "c", "d"}}, 36 } 37 for _, test := range tests { 38 t.Run(test.name, func(t *testing.T) { 39 actual := getDirectDependencies(getAllDependencies(test.dependencies), test.dependencies) 40 sort.Strings(actual) 41 sort.Strings(test.expected) 42 if !reflect.DeepEqual(test.expected, actual) { 43 t.Errorf("Expected: %s, Got: %s", test.expected, actual) 44 } 45 }) 46 } 47 } 48 49 func TestAlternativeVersionsForms(t *testing.T) { 50 tests := []struct { 51 version string 52 expected []string 53 }{ 54 {"1.0", []string{"1.0.0.0", "1.0.0", "1"}}, 55 {"1", []string{"1.0.0.0", "1.0.0", "1.0"}}, 56 {"1.2", []string{"1.2.0.0", "1.2.0"}}, 57 {"1.22.33", []string{"1.22.33.0"}}, 58 {"1.22.33.44", []string{}}, 59 {"1.0.2", []string{"1.0.2.0"}}, 60 } 61 for _, test := range tests { 62 t.Run(test.version, func(t *testing.T) { 63 actual := createAlternativeVersionForms(test.version) 64 sort.Strings(actual) 65 sort.Strings(test.expected) 66 if len(actual) != len(test.expected) { 67 t.Errorf("Expected: %s, Got: %s", test.expected, actual) 68 } 69 70 if len(actual) > 0 && len(test.expected) > 0 && !reflect.DeepEqual(test.expected, actual) { 71 t.Errorf("Expected: %s, Got: %s", test.expected, actual) 72 } 73 }) 74 } 75 } 76 77 func TestLoadPackagesConfig(t *testing.T) { 78 xmlContent := []byte(`<?xml version="1.0" encoding="utf-8"?> 79 <packages> 80 <package id="id1" version="1.0.0" targetFramework="net461" /> 81 <package id="id2" version="2.0.0" targetFramework="net461" /> 82 </packages>`) 83 84 packagesObj := &packagesConfig{} 85 err := xml.Unmarshal(xmlContent, packagesObj) 86 if err != nil { 87 t.Error(err) 88 } 89 90 expected := &packagesConfig{ 91 XMLName: xml.Name{Local: "packages"}, 92 XmlPackages: []xmlPackage{ 93 {Id: "id1", Version: "1.0.0"}, 94 {Id: "id2", Version: "2.0.0"}, 95 }, 96 } 97 98 if !reflect.DeepEqual(expected, packagesObj) { 99 t.Errorf("Expected: %s, Got: %s", expected, packagesObj) 100 } 101 } 102 103 func TestLoadNuspec(t *testing.T) { 104 xmlContent := []byte(`<?xml version="1.0" encoding="utf-8"?> 105 <package> 106 <metadata> 107 <id>ZKWeb.System.Drawing</id> 108 <dependencies> 109 <group targetFramework="targetFramework"> 110 <dependency id="one" version="1.0.0" /> 111 <dependency id="two" version="2.0.0" /> 112 </group> 113 <dependency id="three" version="3.0.0" /> 114 </dependencies> 115 </metadata> 116 </package>>`) 117 118 nuspecObj := &nuspec{} 119 err := xml.Unmarshal(xmlContent, nuspecObj) 120 if err != nil { 121 t.Error(err) 122 } 123 124 expected := &nuspec{ 125 XMLName: xml.Name{Local: "package"}, 126 Metadata: metadata{ 127 Dependencies: xmlDependencies{Groups: []group{{ 128 TargetFramework: "targetFramework", 129 Dependencies: []xmlPackage{{ 130 Id: "one", 131 Version: "1.0.0", 132 }, { 133 Id: "two", 134 Version: "2.0.0", 135 }}}, 136 }, 137 Dependencies: []xmlPackage{{ 138 Id: "three", 139 Version: "3.0.0", 140 }}, 141 }, 142 }, 143 } 144 145 if !reflect.DeepEqual(expected, nuspecObj) { 146 t.Errorf("Expected: %s, Got: %s", expected, nuspecObj) 147 } 148 } 149 150 func TestExtractDependencies(t *testing.T) { 151 extractor, err := extractDependencies(filepath.Join("testdata", "packagesproject", "localcache")) 152 if err != nil { 153 t.Error(err) 154 } 155 156 expectedAllDependencies := []string{"id1", "id2"} 157 allDependencies, err := extractor.AllDependencies() 158 for _, v := range expectedAllDependencies { 159 if _, ok := allDependencies[v]; !ok { 160 t.Error("Expecting", v, "dependency") 161 } 162 } 163 164 expectedChildrenMap := map[string][]string{"id1": {"id2"}, "id2": {"id1"}} 165 childrenMap, err := extractor.ChildrenMap() 166 if err != nil { 167 t.Error(err) 168 } 169 170 if !reflect.DeepEqual(expectedChildrenMap, childrenMap) { 171 t.Errorf("Expected: %s, Got: %s", expectedChildrenMap, childrenMap) 172 } 173 174 expectedDirectDependencies := []string{"id1", "id2"} 175 directDependencies, err := extractor.DirectDependencies() 176 if err != nil { 177 t.Error(err) 178 } 179 180 sort.Strings(directDependencies) 181 sort.Strings(expectedDirectDependencies) 182 if !reflect.DeepEqual(expectedDirectDependencies, directDependencies) { 183 t.Errorf("Expected: %s, Got: %s", expectedDirectDependencies, directDependencies) 184 } 185 } 186 187 func TestPackageNotFoundWithoutFailure(t *testing.T) { 188 log.SetDefaultLogger() 189 _, err := extractDependencies(filepath.Join("testdata", "packagesproject", "localcachenotexists")) 190 if err != nil { 191 t.Error(err) 192 } 193 } 194 195 func extractDependencies(globalPackagePath string) (Extractor, error) { 196 extractor := &packagesExtractor{allDependencies: map[string]*buildinfo.Dependency{}, childrenMap: map[string][]string{}} 197 packagesConfig, err := extractor.loadPackagesConfig(filepath.Join("testdata", "packagesproject", "packages.config")) 198 if err != nil { 199 return extractor, err 200 } 201 err = extractor.extract(packagesConfig, globalPackagePath) 202 if err != nil { 203 return extractor, err 204 } 205 return extractor, nil 206 }