github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/versioning/versioning_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package versioning
     5  
     6  import (
     7  	"net/http"
     8  	"testing"
     9  
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  type versioningMockUtils struct {
    15  	*mock.ExecMockRunner
    16  	*mock.FilesMock
    17  }
    18  
    19  func newVersioningMockUtils() *versioningMockUtils {
    20  	utils := versioningMockUtils{
    21  		ExecMockRunner: &mock.ExecMockRunner{},
    22  		FilesMock:      &mock.FilesMock{},
    23  	}
    24  	return &utils
    25  }
    26  
    27  func (v *versioningMockUtils) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error {
    28  	// so far no dedicated logic required for testing
    29  	return nil
    30  }
    31  
    32  func TestGetArtifact(t *testing.T) {
    33  	t.Run("custom", func(t *testing.T) {
    34  		custom, err := GetArtifact("custom", "test.ini", &Options{VersionField: "theversion", VersionSection: "test"}, nil)
    35  
    36  		assert.NoError(t, err)
    37  
    38  		theType, ok := custom.(*INIfile)
    39  		assert.True(t, ok)
    40  		assert.Equal(t, "test.ini", theType.path)
    41  		assert.Equal(t, "theversion", theType.versionField)
    42  		assert.Equal(t, "test", theType.versionSection)
    43  		assert.Equal(t, "semver2", custom.VersioningScheme())
    44  	})
    45  
    46  	t.Run("docker", func(t *testing.T) {
    47  		docker, err := GetArtifact("docker", "test.ini", &Options{VersionSource: "custom", VersionField: "theversion", VersionSection: "test"}, nil)
    48  
    49  		assert.NoError(t, err)
    50  
    51  		theType, ok := docker.(*Docker)
    52  		assert.True(t, ok)
    53  		assert.Equal(t, "test.ini", theType.path)
    54  		assert.Equal(t, "theversion", theType.options.VersionField)
    55  		assert.Equal(t, "test", theType.options.VersionSection)
    56  		assert.Equal(t, "docker", docker.VersioningScheme())
    57  	})
    58  
    59  	t.Run("dub", func(t *testing.T) {
    60  		dub, err := GetArtifact("dub", "", &Options{VersionField: "theversion"}, nil)
    61  
    62  		assert.NoError(t, err)
    63  
    64  		theType, ok := dub.(*JSONfile)
    65  		assert.True(t, ok)
    66  		assert.Equal(t, "dub.json", theType.path)
    67  		assert.Equal(t, "version", theType.versionField)
    68  		assert.Equal(t, "semver2", dub.VersioningScheme())
    69  	})
    70  
    71  	t.Run("golang - version file", func(t *testing.T) {
    72  		fileExists = func(s string) (bool, error) {
    73  			if s == "go.mod" {
    74  				return false, nil
    75  			}
    76  			return true, nil
    77  		}
    78  		golang, err := GetArtifact("golang", "", &Options{}, nil)
    79  
    80  		assert.NoError(t, err)
    81  
    82  		theType, ok := golang.(*Versionfile)
    83  		assert.True(t, ok)
    84  		assert.Equal(t, "VERSION", theType.path)
    85  		assert.Equal(t, "semver2", golang.VersioningScheme())
    86  	})
    87  
    88  	t.Run("golang - gomod", func(t *testing.T) {
    89  		fileExists = func(s string) (bool, error) {
    90  			if s == "go.mod" {
    91  				return true, nil
    92  			}
    93  			return false, nil
    94  		}
    95  		golang, err := GetArtifact("golang", "", &Options{}, nil)
    96  
    97  		assert.NoError(t, err)
    98  
    99  		theType, ok := golang.(*GoMod)
   100  		assert.True(t, ok)
   101  		assert.Equal(t, "go.mod", theType.path)
   102  		assert.Equal(t, "semver2", golang.VersioningScheme())
   103  	})
   104  
   105  	t.Run("golang - error", func(t *testing.T) {
   106  		fileExists = func(string) (bool, error) { return false, nil }
   107  		_, err := GetArtifact("golang", "", &Options{}, nil)
   108  
   109  		assert.EqualError(t, err, "no build descriptor available, supported: [go.mod VERSION version.txt]")
   110  	})
   111  
   112  	t.Run("gradle", func(t *testing.T) {
   113  		gradle, err := GetArtifact("gradle", "", &Options{VersionField: "theversion"}, nil)
   114  
   115  		assert.NoError(t, err)
   116  
   117  		theType, ok := gradle.(*Gradle)
   118  		assert.True(t, ok)
   119  		assert.Equal(t, "gradle.properties", theType.path)
   120  		assert.Equal(t, "theversion", theType.versionField)
   121  		assert.Equal(t, "semver2", gradle.VersioningScheme())
   122  	})
   123  
   124  	t.Run("helm", func(t *testing.T) {
   125  		helm, err := GetArtifact("helm", "testchart/Chart.yaml", &Options{}, nil)
   126  
   127  		assert.NoError(t, err)
   128  
   129  		theType, ok := helm.(*HelmChart)
   130  		assert.True(t, ok)
   131  		assert.Equal(t, "testchart/Chart.yaml", theType.path)
   132  		assert.Equal(t, "semver2", helm.VersioningScheme())
   133  	})
   134  
   135  	t.Run("maven", func(t *testing.T) {
   136  		opts := Options{
   137  			ProjectSettingsFile: "projectsettings.xml",
   138  			GlobalSettingsFile:  "globalsettings.xml",
   139  			M2Path:              "m2/path",
   140  		}
   141  		maven, err := GetArtifact("maven", "", &opts, nil)
   142  		assert.NoError(t, err)
   143  
   144  		theType, ok := maven.(*Maven)
   145  		assert.True(t, ok)
   146  		assert.Equal(t, "pom.xml", theType.options.PomPath)
   147  		assert.Equal(t, opts.ProjectSettingsFile, theType.options.ProjectSettingsFile)
   148  		assert.Equal(t, opts.GlobalSettingsFile, theType.options.GlobalSettingsFile)
   149  		assert.Equal(t, opts.M2Path, theType.options.M2Path)
   150  		assert.Equal(t, "maven", maven.VersioningScheme())
   151  	})
   152  
   153  	t.Run("mta", func(t *testing.T) {
   154  		mta, err := GetArtifact("mta", "", &Options{VersionField: "theversion"}, nil)
   155  
   156  		assert.NoError(t, err)
   157  
   158  		theType, ok := mta.(*YAMLfile)
   159  		assert.True(t, ok)
   160  		assert.Equal(t, "mta.yaml", theType.path)
   161  		assert.Equal(t, "version", theType.versionField)
   162  		assert.Equal(t, "semver2", mta.VersioningScheme())
   163  	})
   164  
   165  	t.Run("npm", func(t *testing.T) {
   166  		npm, err := GetArtifact("npm", "", &Options{VersionField: "theversion"}, nil)
   167  
   168  		assert.NoError(t, err)
   169  
   170  		theType, ok := npm.(*JSONfile)
   171  		assert.True(t, ok)
   172  		assert.Equal(t, "package.json", theType.path)
   173  		assert.Equal(t, "version", theType.versionField)
   174  		assert.Equal(t, "semver2", npm.VersioningScheme())
   175  	})
   176  
   177  	t.Run("yarn", func(t *testing.T) {
   178  		npm, err := GetArtifact("yarn", "", &Options{VersionField: "theversion"}, nil)
   179  
   180  		assert.NoError(t, err)
   181  
   182  		theType, ok := npm.(*JSONfile)
   183  		assert.True(t, ok)
   184  		assert.Equal(t, "package.json", theType.path)
   185  		assert.Equal(t, "version", theType.versionField)
   186  		assert.Equal(t, "semver2", npm.VersioningScheme())
   187  	})
   188  
   189  	t.Run("pip", func(t *testing.T) {
   190  		fileExists = func(string) (bool, error) { return true, nil }
   191  		pip, err := GetArtifact("pip", "", &Options{}, nil)
   192  
   193  		assert.NoError(t, err)
   194  
   195  		theType, ok := pip.(*Pip)
   196  		assert.True(t, ok)
   197  		assert.Equal(t, "setup.py", theType.path)
   198  		assert.Equal(t, "pep440", pip.VersioningScheme())
   199  	})
   200  
   201  	t.Run("pip - error", func(t *testing.T) {
   202  		fileExists = func(string) (bool, error) { return false, nil }
   203  		_, err := GetArtifact("pip", "", &Options{}, nil)
   204  
   205  		assert.EqualError(t, err, "no build descriptor available, supported: [setup.py version.txt VERSION]")
   206  	})
   207  
   208  	t.Run("sbt", func(t *testing.T) {
   209  		fileExists = func(string) (bool, error) { return true, nil }
   210  		sbt, err := GetArtifact("sbt", "", &Options{VersionField: "theversion"}, nil)
   211  
   212  		assert.NoError(t, err)
   213  
   214  		theType, ok := sbt.(*JSONfile)
   215  		assert.True(t, ok)
   216  		assert.Equal(t, "sbtDescriptor.json", theType.path)
   217  		assert.Equal(t, "version", theType.versionField)
   218  		assert.Equal(t, "semver2", sbt.VersioningScheme())
   219  	})
   220  
   221  	t.Run("not supported build tool", func(t *testing.T) {
   222  		_, err := GetArtifact("nosupport", "whatever", &Options{}, nil)
   223  		assert.EqualError(t, err, "build tool 'nosupport' not supported")
   224  	})
   225  }
   226  
   227  func TestCustomArtifact(t *testing.T) {
   228  	tt := []struct {
   229  		file        string
   230  		field       string
   231  		section     string
   232  		scheme      string
   233  		expected    Artifact
   234  		expectedErr string
   235  	}{
   236  		{file: "not.supported", expectedErr: "file type not supported: 'not.supported'"},
   237  		{file: "test.cfg", field: "testField", section: "testSection", expected: &INIfile{path: "test.cfg", versionField: "testField", versionSection: "testSection"}},
   238  		{file: "test.ini", field: "testField", section: "testSection", expected: &INIfile{path: "test.ini", versionField: "testField", versionSection: "testSection"}},
   239  		{file: "test.ini", field: "testField", section: "testSection", scheme: "maven", expected: &INIfile{path: "test.ini", versionField: "testField", versionSection: "testSection", versioningScheme: "maven"}},
   240  		{file: "test.json", field: "testField", expected: &JSONfile{path: "test.json", versionField: "testField"}},
   241  		{file: "test.yaml", field: "testField", expected: &YAMLfile{path: "test.yaml", versionField: "testField"}},
   242  		{file: "test.yml", field: "testField", expected: &YAMLfile{path: "test.yml", versionField: "testField"}},
   243  		{file: "test.txt", expected: &Versionfile{path: "test.txt"}},
   244  		{file: "test", expected: &Versionfile{path: "test"}},
   245  		{file: "test", scheme: "maven", expected: &Versionfile{path: "test", versioningScheme: "maven"}},
   246  	}
   247  
   248  	for _, test := range tt {
   249  		t.Run(test.file, func(t *testing.T) {
   250  			res, err := customArtifact(test.file, test.field, test.section, test.scheme)
   251  			if len(test.expectedErr) == 0 {
   252  				assert.NoError(t, err)
   253  				assert.Equal(t, test.expected, res)
   254  			} else {
   255  				assert.EqualError(t, err, test.expectedErr)
   256  			}
   257  		})
   258  
   259  	}
   260  }