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  }