github.com/SAP/jenkins-library@v1.362.0/cmd/nexusUpload_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package cmd
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"github.com/SAP/jenkins-library/pkg/maven"
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  	"github.com/SAP/jenkins-library/pkg/nexus"
    12  	"github.com/stretchr/testify/assert"
    13  	"net/http"
    14  	"os"
    15  	"path/filepath"
    16  	"strings"
    17  	"testing"
    18  )
    19  
    20  type mockUtilsBundle struct {
    21  	*mock.FilesMock
    22  	*mock.ExecMockRunner
    23  	mta        bool
    24  	maven      bool
    25  	npm        bool
    26  	properties map[string]map[string]string
    27  	cpe        map[string]string
    28  }
    29  
    30  func (m *mockUtilsBundle) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error {
    31  	return errors.New("test should not download files")
    32  }
    33  
    34  func newMockUtilsBundle(usesMta, usesMaven, usesNpm bool) *mockUtilsBundle {
    35  	utils := mockUtilsBundle{
    36  		FilesMock:      &mock.FilesMock{},
    37  		ExecMockRunner: &mock.ExecMockRunner{},
    38  		mta:            usesMta,
    39  		maven:          usesMaven,
    40  		npm:            usesNpm,
    41  	}
    42  	utils.properties = map[string]map[string]string{}
    43  	utils.cpe = map[string]string{}
    44  	return &utils
    45  }
    46  
    47  func (m *mockUtilsBundle) UsesMta() bool {
    48  	return m.mta
    49  }
    50  
    51  func (m *mockUtilsBundle) UsesMaven() bool {
    52  	return m.maven
    53  }
    54  
    55  func (m *mockUtilsBundle) UsesNpm() bool {
    56  	return m.npm
    57  }
    58  
    59  func (m *mockUtilsBundle) getEnvParameter(path, name string) string {
    60  	path = path + "/" + name
    61  	return m.cpe[path]
    62  }
    63  
    64  func (m *mockUtilsBundle) setProperty(pomFile, expression, value string) {
    65  	pomFile = strings.ReplaceAll(pomFile, "/", string(os.PathSeparator))
    66  	pomFile = strings.ReplaceAll(pomFile, "\\", string(os.PathSeparator))
    67  
    68  	pom := m.properties[pomFile]
    69  	if pom == nil {
    70  		pom = map[string]string{}
    71  		m.properties[pomFile] = pom
    72  	}
    73  	pom[expression] = value
    74  }
    75  
    76  func (m *mockUtilsBundle) evaluate(options *maven.EvaluateOptions, expression string) (string, error) {
    77  	pom := m.properties[options.PomPath]
    78  	if pom == nil {
    79  		return "", fmt.Errorf("pom file '%s' not found", options.PomPath)
    80  	}
    81  	value := pom[expression]
    82  	if value == "<empty>" {
    83  		return "", nil
    84  	}
    85  	if value == "" {
    86  		return "", fmt.Errorf("property '%s' not found in '%s'", expression, options.PomPath)
    87  	}
    88  	return value, nil
    89  }
    90  
    91  type mockUploader struct {
    92  	nexus.Upload
    93  	uploadedArtifacts []nexus.ArtifactDescription
    94  }
    95  
    96  func (m *mockUploader) Clear() {
    97  	// Clear is called after a successful upload. Record the artifacts that are present before
    98  	// they are cleared. This way we can later peek into the set of all artifacts that were
    99  	// uploaded across multiple bundles.
   100  	m.uploadedArtifacts = append(m.uploadedArtifacts, m.GetArtifacts()...)
   101  	m.Upload.Clear()
   102  }
   103  
   104  func createOptions() nexusUploadOptions {
   105  	return nexusUploadOptions{
   106  		MavenRepository: "maven-releases",
   107  		NpmRepository:   "npm-repo",
   108  		GroupID:         "my.group.id",
   109  		ArtifactID:      "artifact.id",
   110  		Version:         "nexus3",
   111  		Url:             "localhost:8081",
   112  	}
   113  }
   114  
   115  var testMtaYml = []byte(`
   116  _schema-version: 2.1.0
   117  ID: test
   118  version: 0.3.0
   119  
   120  modules:
   121  
   122  - name: java
   123    type: java
   124    path: srv
   125  `)
   126  
   127  var testMtaYmlNoVersion = []byte(`
   128  _schema-version: 2.1.0
   129  ID: test
   130  
   131  modules:
   132  - name: java
   133    type: java
   134  `)
   135  
   136  var testPomXml = []byte(`
   137  <project>
   138    <modelVersion>4.0.0</modelVersion>
   139    <groupId>com.mycompany.app</groupId>
   140    <artifactId>my-app</artifactId>
   141    <version>1.0</version>
   142  </project>
   143  `)
   144  
   145  var testPackageJson = []byte(`{
   146    "name": "npm-nexus-upload-test",
   147    "version": "1.0.0"
   148  }
   149  `)
   150  
   151  func TestUploadMTAProjects(t *testing.T) {
   152  	t.Parallel()
   153  	t.Run("Uploading MTA project without groupId parameter fails", func(t *testing.T) {
   154  		t.Parallel()
   155  		utils := newMockUtilsBundle(true, false, false)
   156  		utils.AddFile("mta.yaml", testMtaYml)
   157  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   158  		uploader := mockUploader{}
   159  		options := createOptions()
   160  		options.GroupID = ""
   161  
   162  		err := runNexusUpload(utils, &uploader, &options)
   163  		assert.EqualError(t, err, "the 'groupId' parameter needs to be provided for MTA projects")
   164  		assert.Equal(t, 0, len(uploader.GetArtifacts()))
   165  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   166  	})
   167  	t.Run("Uploading MTA project without artifactId parameter works", func(t *testing.T) {
   168  		t.Parallel()
   169  		utils := newMockUtilsBundle(true, false, false)
   170  		utils.AddFile("mta.yaml", testMtaYml)
   171  		utils.AddFile("test.mtar", []byte("contentsOfMtar"))
   172  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   173  		uploader := mockUploader{}
   174  		options := createOptions()
   175  		options.ArtifactID = ""
   176  
   177  		err := runNexusUpload(utils, &uploader, &options)
   178  		if assert.NoError(t, err) {
   179  			assert.Equal(t, 2, len(uploader.uploadedArtifacts))
   180  			assert.Equal(t, "test", uploader.GetArtifactsID())
   181  		}
   182  	})
   183  	t.Run("Uploading MTA project fails due to missing yaml file", func(t *testing.T) {
   184  		t.Parallel()
   185  		utils := newMockUtilsBundle(true, false, false)
   186  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   187  		uploader := mockUploader{}
   188  		options := createOptions()
   189  
   190  		err := runNexusUpload(utils, &uploader, &options)
   191  		assert.EqualError(t, err, "could not read from required project descriptor file 'mta.yml'")
   192  		assert.Equal(t, 0, len(uploader.GetArtifacts()))
   193  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   194  	})
   195  	t.Run("Uploading MTA project fails due to garbage YAML content", func(t *testing.T) {
   196  		t.Parallel()
   197  		utils := newMockUtilsBundle(true, false, false)
   198  		utils.AddFile("mta.yaml", []byte("garbage"))
   199  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   200  		uploader := mockUploader{}
   201  		options := createOptions()
   202  
   203  		err := runNexusUpload(utils, &uploader, &options)
   204  		assert.EqualError(t, err,
   205  			"failed to parse contents of the project descriptor file 'mta.yaml'")
   206  		assert.Equal(t, 0, len(uploader.GetArtifacts()))
   207  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   208  	})
   209  	t.Run("Uploading MTA project fails due invalid version in YAML content", func(t *testing.T) {
   210  		t.Parallel()
   211  		utils := newMockUtilsBundle(true, false, false)
   212  		utils.AddFile("mta.yaml", []byte(testMtaYmlNoVersion))
   213  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   214  		uploader := mockUploader{}
   215  		options := createOptions()
   216  
   217  		err := runNexusUpload(utils, &uploader, &options)
   218  		assert.EqualError(t, err,
   219  			"the project descriptor file 'mta.yaml' has an invalid version: version must not be empty")
   220  		assert.Equal(t, 0, len(uploader.GetArtifacts()))
   221  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   222  	})
   223  	t.Run("Test uploading mta.yaml project fails due to missing mtar file", func(t *testing.T) {
   224  		t.Parallel()
   225  		utils := newMockUtilsBundle(true, false, false)
   226  		utils.AddFile("mta.yaml", testMtaYml)
   227  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   228  		uploader := mockUploader{}
   229  		options := createOptions()
   230  
   231  		err := runNexusUpload(utils, &uploader, &options)
   232  		assert.EqualError(t, err, "artifact file not found 'test.mtar'")
   233  
   234  		assert.Equal(t, "0.3.0", uploader.GetArtifactsVersion())
   235  		assert.Equal(t, "artifact.id", uploader.GetArtifactsID())
   236  
   237  		// Check the artifacts that /would/ have been uploaded
   238  		artifacts := uploader.GetArtifacts()
   239  		if assert.Equal(t, 1, len(artifacts)) {
   240  			assert.Equal(t, "mta.yaml", artifacts[0].File)
   241  			assert.Equal(t, "yaml", artifacts[0].Type)
   242  		}
   243  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   244  	})
   245  	t.Run("Test uploading mta.yaml project works", func(t *testing.T) {
   246  		t.Parallel()
   247  		utils := newMockUtilsBundle(true, false, false)
   248  		utils.AddFile("mta.yaml", testMtaYml)
   249  		utils.AddFile("test.mtar", []byte("contentsOfMtar"))
   250  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   251  		uploader := mockUploader{}
   252  		options := createOptions()
   253  
   254  		err := runNexusUpload(utils, &uploader, &options)
   255  		assert.NoError(t, err, "expected mta.yaml project upload to work")
   256  
   257  		assert.Equal(t, "0.3.0", uploader.GetArtifactsVersion())
   258  		assert.Equal(t, "artifact.id", uploader.GetArtifactsID())
   259  
   260  		artifacts := uploader.uploadedArtifacts
   261  		if assert.Equal(t, 2, len(artifacts)) {
   262  			assert.Equal(t, "mta.yaml", artifacts[0].File)
   263  			assert.Equal(t, "yaml", artifacts[0].Type)
   264  
   265  			assert.Equal(t, "test.mtar", artifacts[1].File)
   266  			assert.Equal(t, "mtar", artifacts[1].Type)
   267  		}
   268  	})
   269  	t.Run("Test uploading mta.yml project works", func(t *testing.T) {
   270  		t.Parallel()
   271  		utils := newMockUtilsBundle(true, false, false)
   272  		utils.AddFile("mta.yml", testMtaYml)
   273  		utils.AddFile("test.mtar", []byte("contentsOfMtar"))
   274  		utils.cpe[".pipeline/commonPipelineEnvironment/mtarFilePath"] = "test.mtar"
   275  		uploader := mockUploader{}
   276  		options := createOptions()
   277  
   278  		err := runNexusUpload(utils, &uploader, &options)
   279  		assert.NoError(t, err, "expected mta.yml project upload to work")
   280  
   281  		assert.Equal(t, "0.3.0", uploader.GetArtifactsVersion())
   282  		assert.Equal(t, "artifact.id", uploader.GetArtifactsID())
   283  
   284  		artifacts := uploader.uploadedArtifacts
   285  		if assert.Equal(t, 2, len(artifacts)) {
   286  			assert.Equal(t, "mta.yml", artifacts[0].File)
   287  			assert.Equal(t, "yaml", artifacts[0].Type)
   288  
   289  			assert.Equal(t, "test.mtar", artifacts[1].File)
   290  			assert.Equal(t, "mtar", artifacts[1].Type)
   291  		}
   292  	})
   293  }
   294  
   295  func TestUploadArtifacts(t *testing.T) {
   296  	t.Parallel()
   297  	t.Run("Uploading MTA project fails without info", func(t *testing.T) {
   298  		t.Parallel()
   299  		utils := newMockUtilsBundle(false, true, false)
   300  		uploader := mockUploader{}
   301  		options := createOptions()
   302  
   303  		err := uploadArtifacts(utils, &uploader, &options, false)
   304  		assert.EqualError(t, err, "no group ID was provided, or could be established from project files")
   305  	})
   306  	t.Run("Uploading MTA project fails without any artifacts", func(t *testing.T) {
   307  		t.Parallel()
   308  		utils := newMockUtilsBundle(false, true, false)
   309  		uploader := mockUploader{}
   310  		options := createOptions()
   311  
   312  		_ = uploader.SetInfo(options.GroupID, "some.id", "3.0")
   313  
   314  		err := uploadArtifacts(utils, &uploader, &options, false)
   315  		assert.EqualError(t, err, "no artifacts to upload")
   316  	})
   317  	t.Run("Uploading MTA project fails for unknown reasons", func(t *testing.T) {
   318  		t.Parallel()
   319  		utils := newMockUtilsBundle(false, true, false)
   320  
   321  		// Configure mocked execRunner to fail
   322  		utils.ShouldFailOnCommand = map[string]error{}
   323  		utils.ShouldFailOnCommand["mvn"] = fmt.Errorf("failed")
   324  
   325  		uploader := mockUploader{}
   326  		options := createOptions()
   327  		_ = uploader.SetInfo(options.GroupID, "some.id", "3.0")
   328  		_ = uploader.AddArtifact(nexus.ArtifactDescription{
   329  			File: "mta.yaml",
   330  			Type: "yaml",
   331  		})
   332  		_ = uploader.AddArtifact(nexus.ArtifactDescription{
   333  			File: "artifact.mtar",
   334  			Type: "yaml",
   335  		})
   336  
   337  		err := uploadArtifacts(utils, &uploader, &options, false)
   338  		assert.EqualError(t, err, "uploading artifacts for ID 'some.id' failed: failed to run executable, command: '[mvn -Durl=http:// -DgroupId=my.group.id -Dversion=3.0 -DartifactId=some.id -Dfile=mta.yaml -Dpackaging=yaml -DgeneratePom=false -Dfiles=artifact.mtar -Dclassifiers= -Dtypes=yaml -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode "+deployGoal+"]', error: failed")
   339  	})
   340  	t.Run("Uploading bundle generates correct maven parameters", func(t *testing.T) {
   341  		t.Parallel()
   342  		utils := newMockUtilsBundle(false, true, false)
   343  		uploader := mockUploader{}
   344  		options := createOptions()
   345  
   346  		_ = uploader.SetRepoURL("localhost:8081", "nexus3", "maven-releases", "npm-repo")
   347  		_ = uploader.SetInfo(options.GroupID, "my.artifact", "4.0")
   348  		_ = uploader.AddArtifact(nexus.ArtifactDescription{
   349  			File: "mta.yaml",
   350  			Type: "yaml",
   351  		})
   352  		_ = uploader.AddArtifact(nexus.ArtifactDescription{
   353  			File: "pom.yml",
   354  			Type: "pom",
   355  		})
   356  
   357  		err := uploadArtifacts(utils, &uploader, &options, false)
   358  		assert.NoError(t, err, "expected upload as two bundles to work")
   359  		assert.Equal(t, 1, len(utils.Calls))
   360  
   361  		expectedParameters1 := []string{
   362  			"-Durl=http://localhost:8081/repository/maven-releases/",
   363  			"-DgroupId=my.group.id",
   364  			"-Dversion=4.0",
   365  			"-DartifactId=my.artifact",
   366  			"-Dfile=mta.yaml",
   367  			"-Dpackaging=yaml",
   368  			"-DgeneratePom=false",
   369  			"-Dfiles=pom.yml",
   370  			"-Dclassifiers=",
   371  			"-Dtypes=pom",
   372  			"-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn",
   373  			"--batch-mode",
   374  			deployGoal}
   375  		assert.Equal(t, len(expectedParameters1), len(utils.Calls[0].Params))
   376  		assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters1}, utils.Calls[0])
   377  	})
   378  }
   379  
   380  func TestRunNexusUpload(t *testing.T) {
   381  	t.Parallel()
   382  	t.Run("uploading without any repos fails step", func(t *testing.T) {
   383  		t.Parallel()
   384  		utils := newMockUtilsBundle(false, false, true)
   385  		utils.AddFile("package.json", testPackageJson)
   386  		uploader := mockUploader{}
   387  		options := nexusUploadOptions{
   388  			Url: "localhost:8081",
   389  		}
   390  
   391  		err := runNexusUpload(utils, &uploader, &options)
   392  		assert.EqualError(t, err, "none of the parameters 'mavenRepository' and 'npmRepository' are configured, or 'format' should be set if the 'url' already contains the repository ID")
   393  	})
   394  	t.Run("Test uploading simple npm project", func(t *testing.T) {
   395  		t.Parallel()
   396  		utils := newMockUtilsBundle(false, false, true)
   397  		utils.AddFile("package.json", testPackageJson)
   398  		uploader := mockUploader{}
   399  		options := createOptions()
   400  		options.Username = "admin"
   401  		options.Password = "admin123"
   402  
   403  		err := runNexusUpload(utils, &uploader, &options)
   404  		assert.NoError(t, err, "expected npm upload to work")
   405  
   406  		assert.Equal(t, "localhost:8081/repository/npm-repo/", uploader.GetNpmRepoURL())
   407  
   408  		assert.Equal(t, mock.ExecCall{Exec: "npm", Params: []string{"publish"}}, utils.Calls[0])
   409  		assert.Equal(t, []string{"npm_config_registry=http://localhost:8081/repository/npm-repo/", "npm_config_email=project-piper@no-reply.com", "npm_config__auth=YWRtaW46YWRtaW4xMjM="}, utils.Env)
   410  	})
   411  }
   412  
   413  func TestUploadMavenProjects(t *testing.T) {
   414  	t.Parallel()
   415  	t.Run("Uploading Maven project fails due to missing pom.xml", func(t *testing.T) {
   416  		t.Parallel()
   417  		utils := newMockUtilsBundle(false, true, false)
   418  		uploader := mockUploader{}
   419  		options := createOptions()
   420  
   421  		err := runNexusUpload(utils, &uploader, &options)
   422  		assert.EqualError(t, err, "pom.xml not found")
   423  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   424  	})
   425  	t.Run("Test uploading Maven project with POM packaging works", func(t *testing.T) {
   426  		t.Parallel()
   427  		utils := newMockUtilsBundle(false, true, false)
   428  		utils.setProperty("pom.xml", "project.version", "1.0")
   429  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   430  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   431  		utils.setProperty("pom.xml", "project.packaging", "pom")
   432  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   433  		utils.AddFile("pom.xml", testPomXml)
   434  		uploader := mockUploader{}
   435  		options := createOptions()
   436  
   437  		err := runNexusUpload(utils, &uploader, &options)
   438  		assert.NoError(t, err, "expected Maven upload to work")
   439  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   440  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   441  
   442  		artifacts := uploader.uploadedArtifacts
   443  		if assert.Equal(t, 1, len(artifacts)) {
   444  			assert.Equal(t, "pom.xml", artifacts[0].File)
   445  			assert.Equal(t, "pom", artifacts[0].Type)
   446  		}
   447  	})
   448  	t.Run("Test uploading Maven project with JAR packaging fails without main target", func(t *testing.T) {
   449  		t.Parallel()
   450  		utils := newMockUtilsBundle(false, true, false)
   451  		utils.setProperty("pom.xml", "project.version", "1.0")
   452  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   453  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   454  		utils.setProperty("pom.xml", "project.packaging", "jar")
   455  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   456  		utils.AddFile("pom.xml", testPomXml)
   457  		utils.AddDir("target")
   458  		uploader := mockUploader{}
   459  		options := createOptions()
   460  
   461  		err := runNexusUpload(utils, &uploader, &options)
   462  		assert.EqualError(t, err, "target artifact not found for packaging 'jar'")
   463  		assert.Equal(t, 0, len(uploader.uploadedArtifacts))
   464  	})
   465  	t.Run("Test uploading Maven project with JAR packaging works", func(t *testing.T) {
   466  		t.Parallel()
   467  		utils := newMockUtilsBundle(false, true, false)
   468  		utils.setProperty("pom.xml", "project.version", "1.0")
   469  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   470  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   471  		utils.setProperty("pom.xml", "project.packaging", "jar")
   472  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   473  		utils.AddFile("pom.xml", testPomXml)
   474  		utils.AddFile(filepath.Join("target", "my-app-1.0.jar"), []byte("contentsOfJar"))
   475  		uploader := mockUploader{}
   476  		options := createOptions()
   477  
   478  		err := runNexusUpload(utils, &uploader, &options)
   479  		assert.NoError(t, err, "expected Maven upload to work")
   480  
   481  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   482  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   483  
   484  		artifacts := uploader.uploadedArtifacts
   485  		if assert.Equal(t, 2, len(artifacts)) {
   486  			assert.Equal(t, "pom.xml", artifacts[0].File)
   487  			assert.Equal(t, "pom", artifacts[0].Type)
   488  
   489  			assert.Equal(t, filepath.Join("target", "my-app-1.0.jar"), artifacts[1].File)
   490  			assert.Equal(t, "jar", artifacts[1].Type)
   491  		}
   492  	})
   493  	t.Run("Test uploading Maven project with fall-back to JAR packaging works", func(t *testing.T) {
   494  		t.Parallel()
   495  		utils := newMockUtilsBundle(false, true, false)
   496  		utils.setProperty("pom.xml", "project.version", "1.0")
   497  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   498  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   499  		utils.setProperty("pom.xml", "project.packaging", "<empty>")
   500  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   501  		utils.AddFile("pom.xml", testPomXml)
   502  		utils.AddFile(filepath.Join("target", "my-app-1.0.jar"), []byte("contentsOfJar"))
   503  		uploader := mockUploader{}
   504  		options := createOptions()
   505  
   506  		err := runNexusUpload(utils, &uploader, &options)
   507  		assert.NoError(t, err, "expected Maven upload to work")
   508  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   509  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   510  
   511  		artifacts := uploader.uploadedArtifacts
   512  		if assert.Equal(t, 2, len(artifacts)) {
   513  			assert.Equal(t, "pom.xml", artifacts[0].File)
   514  			assert.Equal(t, "pom", artifacts[0].Type)
   515  
   516  			assert.Equal(t, filepath.Join("target", "my-app-1.0.jar"), artifacts[1].File)
   517  			assert.Equal(t, "jar", artifacts[1].Type)
   518  		}
   519  	})
   520  	t.Run("Test uploading Maven project with fall-back to group id from parameters works", func(t *testing.T) {
   521  		t.Parallel()
   522  		utils := newMockUtilsBundle(false, true, false)
   523  		utils.setProperty("pom.xml", "project.version", "1.0")
   524  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   525  		utils.setProperty("pom.xml", "project.packaging", "pom")
   526  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   527  		utils.AddFile("pom.xml", testPomXml)
   528  		uploader := mockUploader{}
   529  		options := createOptions()
   530  		options.GroupID = "awesome.group"
   531  
   532  		err := runNexusUpload(utils, &uploader, &options)
   533  		assert.NoError(t, err, "expected Maven upload to work")
   534  
   535  		assert.Equal(t, "localhost:8081/repository/maven-releases/",
   536  			uploader.GetMavenRepoURL())
   537  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   538  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   539  
   540  		artifacts := uploader.uploadedArtifacts
   541  		if assert.Equal(t, 1, len(artifacts)) {
   542  			assert.Equal(t, "pom.xml", artifacts[0].File)
   543  			assert.Equal(t, "pom", artifacts[0].Type)
   544  		}
   545  	})
   546  	t.Run("Test uploading Maven project with fall-back for finalBuildName works", func(t *testing.T) {
   547  		t.Parallel()
   548  		utils := newMockUtilsBundle(false, true, false)
   549  		utils.setProperty("pom.xml", "project.version", "1.0")
   550  		utils.setProperty("pom.xml", "project.groupId", "awesome.group")
   551  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   552  		utils.setProperty("pom.xml", "project.packaging", "jar")
   553  		utils.AddFile("pom.xml", testPomXml)
   554  		utils.AddFile(filepath.Join("target", "my-app-1.0.jar"), []byte("contentsOfJar"))
   555  		uploader := mockUploader{}
   556  		options := createOptions()
   557  
   558  		err := runNexusUpload(utils, &uploader, &options)
   559  		assert.NoError(t, err, "expected Maven upload to work")
   560  
   561  		assert.Equal(t, "localhost:8081/repository/maven-releases/",
   562  			uploader.GetMavenRepoURL())
   563  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   564  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   565  
   566  		artifacts := uploader.uploadedArtifacts
   567  		if assert.Equal(t, 2, len(artifacts)) {
   568  			assert.Equal(t, "pom.xml", artifacts[0].File)
   569  			assert.Equal(t, "pom", artifacts[0].Type)
   570  			assert.Equal(t, filepath.Join("target", "my-app-1.0.jar"), artifacts[1].File)
   571  			assert.Equal(t, "jar", artifacts[1].Type)
   572  		}
   573  	})
   574  	t.Run("Test uploading Maven project with application module and finalName works", func(t *testing.T) {
   575  		t.Parallel()
   576  		utils := newMockUtilsBundle(false, true, false)
   577  		utils.setProperty("pom.xml", "project.version", "1.0")
   578  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   579  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   580  		utils.setProperty("pom.xml", "project.packaging", "pom")
   581  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   582  		utils.setProperty("application/pom.xml", "project.version", "1.0")
   583  		utils.setProperty("application/pom.xml", "project.groupId", "com.mycompany.app")
   584  		utils.setProperty("application/pom.xml", "project.artifactId", "my-app-app")
   585  		utils.setProperty("application/pom.xml", "project.packaging", "war")
   586  		utils.setProperty("application/pom.xml", "project.build.finalName", "final-artifact")
   587  		utils.setProperty("integration-tests/pom.xml", "project.version", "1.0")
   588  		utils.setProperty("integration-tests/pom.xml", "project.groupId", "com.mycompany.app")
   589  		utils.setProperty("integration-tests/pom.xml", "project.artifactId", "my-app-app-integration-tests")
   590  		utils.setProperty("integration-tests/pom.xml", "project.packaging", "jar")
   591  		utils.setProperty("integration-tests/pom.xml", "project.build.finalName", "final-artifact")
   592  		utils.setProperty("unit-tests/pom.xml", "project.version", "1.0")
   593  		utils.setProperty("unit-tests/pom.xml", "project.groupId", "com.mycompany.app")
   594  		utils.setProperty("unit-tests/pom.xml", "project.artifactId", "my-app-app-unit-tests")
   595  		utils.setProperty("unit-tests/pom.xml", "project.packaging", "jar")
   596  		utils.setProperty("unit-tests/pom.xml", "project.build.finalName", "final-artifact")
   597  		utils.setProperty("performance-tests/pom.xml", "project.version", "1.0")
   598  		utils.setProperty("performance-tests/pom.xml", "project.groupId", "com.mycompany.app")
   599  		utils.setProperty("performance-tests/pom.xml", "project.artifactId", "my-app-app")
   600  		utils.setProperty("performance-tests/pom.xml", "project.packaging", "")
   601  		utils.AddFile("pom.xml", testPomXml)
   602  		utils.AddFile(filepath.Join("application", "pom.xml"), testPomXml)
   603  		utils.AddFile("application/target/final-artifact.war", []byte("contentsOfJar"))
   604  		utils.AddFile("application/target/final-artifact-classes.jar", []byte("contentsOfClassesJar"))
   605  		utils.AddFile("integration-tests/pom.xml", testPomXml)
   606  		utils.AddFile("integration-tests/target/final-artifact-integration-tests.jar", []byte("contentsOfJar"))
   607  		utils.AddFile("unit-tests/pom.xml", testPomXml)
   608  		utils.AddFile("unit-tests/target/final-artifact-unit-tests.jar", []byte("contentsOfJar"))
   609  		utils.AddFile("performance-tests/pom.xml", testPomXml)
   610  		uploader := mockUploader{}
   611  		options := createOptions()
   612  
   613  		err := runNexusUpload(utils, &uploader, &options)
   614  		assert.NoError(t, err, "expected upload of maven project with application module to succeed")
   615  		assert.Equal(t, "1.0", uploader.GetArtifactsVersion())
   616  		assert.Equal(t, "my-app", uploader.GetArtifactsID())
   617  
   618  		artifacts := uploader.uploadedArtifacts
   619  		if assert.Equal(t, 4, len(artifacts)) {
   620  			assert.Equal(t, filepath.Join("application", "pom.xml"), artifacts[0].File)
   621  			assert.Equal(t, "pom", artifacts[0].Type)
   622  
   623  			assert.Equal(t, filepath.Join("application", "target", "final-artifact.war"), artifacts[1].File)
   624  			assert.Equal(t, "war", artifacts[1].Type)
   625  
   626  			assert.Equal(t, filepath.Join("application", "target", "final-artifact-classes.jar"), artifacts[2].File)
   627  			assert.Equal(t, "jar", artifacts[2].Type)
   628  
   629  			assert.Equal(t, "pom.xml", artifacts[3].File)
   630  			assert.Equal(t, "pom", artifacts[3].Type)
   631  
   632  		}
   633  		if assert.Equal(t, 2, len(utils.Calls)) {
   634  			expectedParameters1 := []string{
   635  				"-Durl=http://localhost:8081/repository/maven-releases/",
   636  				"-DgroupId=com.mycompany.app",
   637  				"-Dversion=1.0",
   638  				"-DartifactId=my-app-app",
   639  				"-Dfile=" + filepath.Join("application", "pom.xml"),
   640  				"-Dpackaging=pom",
   641  				"-Dfiles=" + filepath.Join("application", "target", "final-artifact.war") + "," + filepath.Join("application", "target", "final-artifact-classes.jar"),
   642  				"-Dclassifiers=,classes",
   643  				"-Dtypes=war,jar",
   644  				"-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn",
   645  				"--batch-mode",
   646  				deployGoal}
   647  			assert.Equal(t, len(expectedParameters1), len(utils.Calls[0].Params))
   648  			assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters1}, utils.Calls[0])
   649  
   650  			expectedParameters2 := []string{
   651  				"-Durl=http://localhost:8081/repository/maven-releases/",
   652  				"-DgroupId=com.mycompany.app",
   653  				"-Dversion=1.0",
   654  				"-DartifactId=my-app",
   655  				"-Dfile=pom.xml",
   656  				"-Dpackaging=pom",
   657  				"-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn",
   658  				"--batch-mode",
   659  				deployGoal}
   660  			assert.Equal(t, len(expectedParameters2), len(utils.Calls[1].Params))
   661  			assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters2}, utils.Calls[1])
   662  		}
   663  	})
   664  	t.Run("Write credentials settings", func(t *testing.T) {
   665  		t.Parallel()
   666  		utils := newMockUtilsBundle(false, true, false)
   667  		utils.setProperty("pom.xml", "project.version", "1.0")
   668  		utils.setProperty("pom.xml", "project.groupId", "com.mycompany.app")
   669  		utils.setProperty("pom.xml", "project.artifactId", "my-app")
   670  		utils.setProperty("pom.xml", "project.packaging", "pom")
   671  		utils.setProperty("pom.xml", "project.build.finalName", "my-app-1.0")
   672  		utils.AddFile("pom.xml", testPomXml)
   673  		uploader := mockUploader{}
   674  		options := createOptions()
   675  		options.Username = "admin"
   676  		options.Password = "admin123"
   677  
   678  		err := runNexusUpload(utils, &uploader, &options)
   679  		assert.NoError(t, err, "expected Maven upload to work")
   680  
   681  		assert.Equal(t, 1, len(utils.Calls))
   682  		expectedParameters1 := []string{
   683  			"--settings",
   684  			settingsPath,
   685  			"-Durl=http://localhost:8081/repository/maven-releases/",
   686  			"-DgroupId=com.mycompany.app",
   687  			"-Dversion=1.0",
   688  			"-DartifactId=my-app",
   689  			"-DrepositoryId=" + settingsServerID,
   690  			"-Dfile=pom.xml",
   691  			"-Dpackaging=pom",
   692  			"-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn",
   693  			"--batch-mode",
   694  			deployGoal}
   695  		assert.Equal(t, len(expectedParameters1), len(utils.Calls[0].Params))
   696  		assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters1}, utils.Calls[0])
   697  
   698  		expectedEnv := []string{"NEXUS_username=admin", "NEXUS_password=admin123"}
   699  		assert.Equal(t, 2, len(utils.Env))
   700  		assert.Equal(t, expectedEnv, utils.Env)
   701  
   702  		assert.False(t, utils.HasFile(settingsPath))
   703  		assert.True(t, utils.HasRemovedFile(settingsPath))
   704  	})
   705  }
   706  
   707  func TestSetupNexusCredentialsSettingsFile(t *testing.T) {
   708  	t.Parallel()
   709  	utils := newMockUtilsBundle(false, true, false)
   710  	options := nexusUploadOptions{Username: "admin", Password: "admin123"}
   711  	mavenOptions := maven.ExecuteOptions{}
   712  	settingsPath, err := setupNexusCredentialsSettingsFile(utils, &options, &mavenOptions)
   713  
   714  	assert.NoError(t, err, "expected setting up credentials settings.xml to work")
   715  	assert.Equal(t, 0, len(utils.Calls))
   716  	expectedEnv := []string{"NEXUS_username=admin", "NEXUS_password=admin123"}
   717  	assert.Equal(t, 2, len(utils.Env))
   718  	assert.Equal(t, expectedEnv, utils.Env)
   719  
   720  	assert.True(t, settingsPath != "")
   721  	assert.True(t, utils.HasFile(settingsPath))
   722  }