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 }