github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/cmd/abapEnvironmentRunATCCheck_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package cmd 5 6 import ( 7 "encoding/xml" 8 "os" 9 "testing" 10 11 "github.com/SAP/jenkins-library/pkg/abaputils" 12 "github.com/SAP/jenkins-library/pkg/mock" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestHostConfig(t *testing.T) { 17 t.Run("Check Host: ABAP Endpoint", func(t *testing.T) { 18 config := abaputils.AbapEnvironmentOptions{ 19 Username: "testUser", 20 Password: "testPassword", 21 Host: "https://api.endpoint.com", 22 } 23 options := abaputils.AbapEnvironmentRunATCCheckOptions{ 24 AbapEnvOptions: config, 25 } 26 27 execRunner := &mock.ExecMockRunner{} 28 autils := abaputils.AbapUtils{ 29 Exec: execRunner, 30 } 31 var con abaputils.ConnectionDetailsHTTP 32 con, error := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "") 33 34 if error == nil { 35 assert.Equal(t, "testUser", con.User) 36 assert.Equal(t, "testPassword", con.Password) 37 assert.Equal(t, "https://api.endpoint.com", con.URL) 38 assert.Equal(t, "", con.XCsrfToken) 39 } 40 }) 41 t.Run("No host/ServiceKey configuration", func(t *testing.T) { 42 // Testing without CfOrg parameter 43 config := abaputils.AbapEnvironmentOptions{ 44 CfAPIEndpoint: "https://api.endpoint.com", 45 CfSpace: "testSpace", 46 CfServiceInstance: "testInstance", 47 CfServiceKeyName: "testServiceKey", 48 Username: "testUser", 49 Password: "testPassword", 50 } 51 options := abaputils.AbapEnvironmentRunATCCheckOptions{ 52 AbapEnvOptions: config, 53 } 54 55 execRunner := &mock.ExecMockRunner{} 56 autils := abaputils.AbapUtils{ 57 Exec: execRunner, 58 } 59 60 _, err := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "") 61 assert.EqualError(t, err, "Parameters missing. Please provide EITHER the Host of the ABAP server OR the Cloud Foundry ApiEndpoint, Organization, Space, Service Instance and a corresponding Service Key for the Communication Scenario SAP_COM_0510") 62 63 _, err = autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "") 64 assert.EqualError(t, err, "Parameters missing. Please provide EITHER the Host of the ABAP server OR the Cloud Foundry ApiEndpoint, Organization, Space, Service Instance and a corresponding Service Key for the Communication Scenario SAP_COM_0510") 65 }) 66 67 t.Run("Check Host: CF Service Key", func(t *testing.T) { 68 config := abaputils.AbapEnvironmentOptions{ 69 CfAPIEndpoint: "https://api.endpoint.com", 70 CfSpace: "testSpace", 71 CfOrg: "Test", 72 CfServiceInstance: "testInstance", 73 CfServiceKeyName: "testServiceKey", 74 Username: "testUser", 75 Password: "testPassword", 76 } 77 options := abaputils.AbapEnvironmentRunATCCheckOptions{ 78 AbapEnvOptions: config, 79 } 80 execRunner := &mock.ExecMockRunner{} 81 autils := abaputils.AbapUtils{ 82 Exec: execRunner, 83 } 84 var con abaputils.ConnectionDetailsHTTP 85 con, error := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "") 86 if error == nil { 87 assert.Equal(t, "", con.User) 88 assert.Equal(t, "", con.Password) 89 assert.Equal(t, "", con.URL) 90 assert.Equal(t, "", con.XCsrfToken) 91 } 92 }) 93 } 94 95 func TestATCTrigger(t *testing.T) { 96 t.Run("Trigger ATC run test", func(t *testing.T) { 97 tokenExpected := "myToken" 98 99 client := &abaputils.ClientMock{ 100 Body: `ATC trigger test`, 101 Token: tokenExpected, 102 } 103 104 con := abaputils.ConnectionDetailsHTTP{ 105 User: "Test", 106 Password: "Test", 107 URL: "https://api.endpoint.com/Entity/", 108 } 109 resp, error := runATC("GET", con, []byte(client.Body), client) 110 if error == nil { 111 assert.Equal(t, tokenExpected, resp.Header["X-Csrf-Token"][0]) 112 assert.Equal(t, int64(0), resp.ContentLength) 113 assert.Equal(t, []string([]string(nil)), resp.Header["Location"]) 114 } 115 }) 116 } 117 118 func TestFetchXcsrfToken(t *testing.T) { 119 t.Run("FetchXcsrfToken Test", func(t *testing.T) { 120 tokenExpected := "myToken" 121 122 client := &abaputils.ClientMock{ 123 Body: `Xcsrf Token test`, 124 Token: tokenExpected, 125 } 126 127 con := abaputils.ConnectionDetailsHTTP{ 128 User: "Test", 129 Password: "Test", 130 URL: "https://api.endpoint.com/Entity/", 131 } 132 token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client) 133 if error == nil { 134 assert.Equal(t, tokenExpected, token) 135 } 136 }) 137 t.Run("failure case: fetch token", func(t *testing.T) { 138 tokenExpected := "" 139 140 client := &abaputils.ClientMock{ 141 Body: `Xcsrf Token test`, 142 Token: "", 143 } 144 145 con := abaputils.ConnectionDetailsHTTP{ 146 User: "Test", 147 Password: "Test", 148 URL: "https://api.endpoint.com/Entity/", 149 } 150 token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client) 151 if error == nil { 152 assert.Equal(t, tokenExpected, token) 153 } 154 }) 155 } 156 157 func TestPollATCRun(t *testing.T) { 158 t.Run("ATC run Poll Test", func(t *testing.T) { 159 tokenExpected := "myToken" 160 161 client := &abaputils.ClientMock{ 162 Body: `ATC Poll test`, 163 Token: tokenExpected, 164 } 165 166 con := abaputils.ConnectionDetailsHTTP{ 167 User: "Test", 168 Password: "Test", 169 URL: "https://api.endpoint.com/Entity/", 170 } 171 resp, err := pollATCRun(con, []byte(client.Body), client) 172 if err != nil { 173 assert.Equal(t, "", resp) 174 assert.EqualError(t, err, "Could not get any response from ATC poll: Status from ATC run is empty. Either it's not an ABAP system or ATC run hasn't started") 175 176 } 177 }) 178 } 179 180 func TestGetHTTPResponseATCRun(t *testing.T) { 181 t.Run("Get HTTP Response from ATC run Test", func(t *testing.T) { 182 client := &abaputils.ClientMock{ 183 Body: `HTTP response test`, 184 } 185 186 con := abaputils.ConnectionDetailsHTTP{ 187 User: "Test", 188 Password: "Test", 189 URL: "https://api.endpoint.com/Entity/", 190 } 191 resp, err := getHTTPResponseATCRun("GET", con, []byte(client.Body), client) 192 assert.NoError(t, err) 193 defer resp.Body.Close() 194 if err == nil { 195 assert.Equal(t, int64(0), resp.ContentLength) 196 assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"]) 197 } 198 }) 199 } 200 201 func TestGetResultATCRun(t *testing.T) { 202 t.Run("Get HTTP Response from ATC run Test", func(t *testing.T) { 203 client := &abaputils.ClientMock{ 204 BodyList: []string{ 205 `ATC result body`, 206 }, 207 } 208 209 con := abaputils.ConnectionDetailsHTTP{ 210 User: "Test", 211 Password: "Test", 212 URL: "https://api.endpoint.com/Entity/", 213 } 214 resp, err := getResultATCRun("GET", con, []byte(client.Body), client) 215 assert.NoError(t, err) 216 defer resp.Body.Close() 217 if err == nil { 218 assert.Equal(t, int64(0), resp.ContentLength) 219 assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"]) 220 } 221 }) 222 } 223 224 func TestParseATCResult(t *testing.T) { 225 t.Run("succes case: test parsing example XML result", func(t *testing.T) { 226 dir := t.TempDir() 227 oldCWD, _ := os.Getwd() 228 _ = os.Chdir(dir) 229 // clean up tmp dir 230 defer func() { 231 _ = os.Chdir(oldCWD) 232 }() 233 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 234 <checkstyle> 235 <file name="testFile"> 236 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 237 </error> 238 <error message="testMessage2" source="sourceTester" line="2" severity="info"> 239 </error> 240 </file> 241 <file name="testFile2"> 242 <error message="testMessage" source="sourceTester" line="1" severity="error"> 243 </error> 244 </file> 245 </checkstyle>` 246 body := []byte(bodyString) 247 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, "") 248 assert.Equal(t, false, failStep) 249 assert.Equal(t, nil, err) 250 }) 251 t.Run("succes case: test parsing example XML result - Fail on Severity error", func(t *testing.T) { 252 dir := t.TempDir() 253 oldCWD, _ := os.Getwd() 254 _ = os.Chdir(dir) 255 // clean up tmp dir 256 defer func() { 257 _ = os.Chdir(oldCWD) 258 }() 259 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 260 <checkstyle> 261 <file name="testFile"> 262 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 263 </error> 264 <error message="testMessage2" source="sourceTester" line="2" severity="info"> 265 </error> 266 </file> 267 <file name="testFile2"> 268 <error message="testMessage" source="sourceTester" line="1" severity="warning"> 269 </error> 270 </file> 271 </checkstyle>` 272 body := []byte(bodyString) 273 doFailOnSeverityLevel := "error" 274 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 275 //fail true 276 assert.Equal(t, true, failStep) 277 //but no error here 278 assert.Equal(t, nil, err) 279 }) 280 t.Run("succes case: test parsing example XML result - Fail on Severity warning", func(t *testing.T) { 281 dir := t.TempDir() 282 oldCWD, _ := os.Getwd() 283 _ = os.Chdir(dir) 284 // clean up tmp dir 285 defer func() { 286 _ = os.Chdir(oldCWD) 287 }() 288 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 289 <checkstyle> 290 <file name="testFile"> 291 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 292 </error> 293 <error message="testMessage2" source="sourceTester" line="2" severity="info"> 294 </error> 295 </file> 296 <file name="testFile2"> 297 <error message="testMessage" source="sourceTester" line="1" severity="warning"> 298 </error> 299 </file> 300 </checkstyle>` 301 body := []byte(bodyString) 302 doFailOnSeverityLevel := "warning" 303 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 304 //fail true 305 assert.Equal(t, true, failStep) 306 //but no error here 307 assert.Equal(t, nil, err) 308 }) 309 t.Run("succes case: test parsing example XML result - Fail on Severity info", func(t *testing.T) { 310 dir := t.TempDir() 311 oldCWD, _ := os.Getwd() 312 _ = os.Chdir(dir) 313 // clean up tmp dir 314 defer func() { 315 _ = os.Chdir(oldCWD) 316 }() 317 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 318 <checkstyle> 319 <file name="testFile"> 320 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 321 </error> 322 <error message="testMessage2" source="sourceTester" line="2" severity="info"> 323 </error> 324 </file> 325 <file name="testFile2"> 326 <error message="testMessage" source="sourceTester" line="1" severity="warning"> 327 </error> 328 </file> 329 </checkstyle>` 330 body := []byte(bodyString) 331 doFailOnSeverityLevel := "info" 332 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 333 //fail true 334 assert.Equal(t, true, failStep) 335 //but no error here 336 assert.Equal(t, nil, err) 337 }) 338 t.Run("succes case: test parsing example XML result - Fail on Severity warning - only errors", func(t *testing.T) { 339 dir := t.TempDir() 340 oldCWD, _ := os.Getwd() 341 _ = os.Chdir(dir) 342 // clean up tmp dir 343 defer func() { 344 _ = os.Chdir(oldCWD) 345 }() 346 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 347 <checkstyle> 348 <file name="testFile"> 349 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 350 </error> 351 <error message="testMessage2" source="sourceTester" line="2" severity="error"> 352 </error> 353 </file> 354 <file name="testFile2"> 355 <error message="testMessage" source="sourceTester" line="1" severity="error"> 356 </error> 357 </file> 358 </checkstyle>` 359 body := []byte(bodyString) 360 doFailOnSeverityLevel := "warning" 361 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 362 //fail true 363 assert.Equal(t, true, failStep) 364 //but no error here 365 assert.Equal(t, nil, err) 366 }) 367 t.Run("succes case: test parsing example XML result - Fail on Severity info - only errors", func(t *testing.T) { 368 dir := t.TempDir() 369 oldCWD, _ := os.Getwd() 370 _ = os.Chdir(dir) 371 // clean up tmp dir 372 defer func() { 373 _ = os.Chdir(oldCWD) 374 }() 375 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 376 <checkstyle> 377 <file name="testFile"> 378 <error message="testMessage1" source="sourceTester" line="1" severity="error"> 379 </error> 380 <error message="testMessage2" source="sourceTester" line="2" severity="error"> 381 </error> 382 </file> 383 <file name="testFile2"> 384 <error message="testMessage" source="sourceTester" line="1" severity="error"> 385 </error> 386 </file> 387 </checkstyle>` 388 body := []byte(bodyString) 389 doFailOnSeverityLevel := "info" 390 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 391 //fail true 392 assert.Equal(t, true, failStep) 393 //but no error here 394 assert.Equal(t, nil, err) 395 }) 396 t.Run("succes case: test parsing example XML result - Fail on Severity info - only warnings", func(t *testing.T) { 397 dir := t.TempDir() 398 oldCWD, _ := os.Getwd() 399 _ = os.Chdir(dir) 400 // clean up tmp dir 401 defer func() { 402 _ = os.Chdir(oldCWD) 403 }() 404 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 405 <checkstyle> 406 <file name="testFile"> 407 <error message="testMessage1" source="sourceTester" line="1" severity="warning"> 408 </error> 409 <error message="testMessage2" source="sourceTester" line="2" severity="warning"> 410 </error> 411 </file> 412 <file name="testFile2"> 413 <error message="testMessage" source="sourceTester" line="1" severity="warning"> 414 </error> 415 </file> 416 </checkstyle>` 417 body := []byte(bodyString) 418 doFailOnSeverityLevel := "info" 419 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 420 //fail true 421 assert.Equal(t, true, failStep) 422 //but no error here 423 assert.Equal(t, nil, err) 424 }) 425 t.Run("succes case: test parsing example XML result - NOT Fail on Severity warning - only infos", func(t *testing.T) { 426 dir := t.TempDir() 427 oldCWD, _ := os.Getwd() 428 _ = os.Chdir(dir) 429 // clean up tmp dir 430 defer func() { 431 _ = os.Chdir(oldCWD) 432 }() 433 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 434 <checkstyle> 435 <file name="testFile"> 436 <error message="testMessage1" source="sourceTester" line="1" severity="info"> 437 </error> 438 <error message="testMessage2" source="sourceTester" line="2" severity="info"> 439 </error> 440 </file> 441 <file name="testFile2"> 442 <error message="testMessage" source="sourceTester" line="1" severity="info"> 443 </error> 444 </file> 445 </checkstyle>` 446 body := []byte(bodyString) 447 doFailOnSeverityLevel := "warning" 448 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 449 //fail false 450 assert.Equal(t, false, failStep) 451 //no error here 452 assert.Equal(t, nil, err) 453 }) 454 t.Run("succes case: test parsing example XML result - NOT Fail on Severity error - only warnings", func(t *testing.T) { 455 dir := t.TempDir() 456 oldCWD, _ := os.Getwd() 457 _ = os.Chdir(dir) 458 // clean up tmp dir 459 defer func() { 460 _ = os.Chdir(oldCWD) 461 }() 462 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 463 <checkstyle> 464 <file name="testFile"> 465 <error message="testMessage1" source="sourceTester" line="1" severity="warning"> 466 </error> 467 <error message="testMessage2" source="sourceTester" line="2" severity="warning"> 468 </error> 469 </file> 470 <file name="testFile2"> 471 <error message="testMessage" source="sourceTester" line="1" severity="warning"> 472 </error> 473 </file> 474 </checkstyle>` 475 body := []byte(bodyString) 476 doFailOnSeverityLevel := "error" 477 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, doFailOnSeverityLevel) 478 //fail false 479 assert.Equal(t, false, failStep) 480 //no error here 481 assert.Equal(t, nil, err) 482 }) 483 t.Run("succes case: test parsing empty XML result", func(t *testing.T) { 484 dir := t.TempDir() 485 oldCWD, _ := os.Getwd() 486 _ = os.Chdir(dir) 487 // clean up tmp dir 488 defer func() { 489 _ = os.Chdir(oldCWD) 490 }() 491 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 492 <checkstyle> 493 </checkstyle>` 494 body := []byte(bodyString) 495 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, "") 496 assert.Equal(t, false, failStep) 497 assert.Equal(t, nil, err) 498 }) 499 t.Run("failure case: parsing empty xml", func(t *testing.T) { 500 var bodyString string 501 body := []byte(bodyString) 502 503 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, "") 504 assert.Equal(t, false, failStep) 505 assert.EqualError(t, err, "Parsing ATC result failed: Body is empty, can't parse empty body") 506 }) 507 t.Run("failure case: html response", func(t *testing.T) { 508 dir := t.TempDir() 509 oldCWD, _ := os.Getwd() 510 _ = os.Chdir(dir) 511 // clean up tmp dir 512 defer func() { 513 _ = os.Chdir(oldCWD) 514 }() 515 bodyString := `<html><head><title>HTMLTestResponse</title</head></html>` 516 body := []byte(bodyString) 517 err, failStep := logAndPersistAndEvaluateATCResults(&mock.FilesMock{}, body, "ATCResults.xml", false, "") 518 assert.Equal(t, false, failStep) 519 assert.EqualError(t, err, "The Software Component could not be checked. Please make sure the respective Software Component has been cloned successfully on the system") 520 }) 521 } 522 523 func TestBuildATCCheckBody(t *testing.T) { 524 t.Run("Test build body with no ATC Object set - no software component and package", func(t *testing.T) { 525 expectedObjectSet := "<obj:objectSet></obj:objectSet>" 526 527 var config ATCConfiguration 528 529 objectSet, err := getATCObjectSet(config) 530 531 assert.Equal(t, expectedObjectSet, objectSet) 532 assert.Equal(t, nil, err) 533 }) 534 t.Run("success case: Test build body with example yaml config", func(t *testing.T) { 535 expectedObjectSet := "<obj:objectSet><obj:softwarecomponents><obj:softwarecomponent value=\"testSoftwareComponent\"/><obj:softwarecomponent value=\"testSoftwareComponent2\"/></obj:softwarecomponents><obj:packages><obj:package value=\"testPackage\" includeSubpackages=\"true\"/><obj:package value=\"testPackage2\" includeSubpackages=\"false\"/></obj:packages></obj:objectSet>" 536 537 config := ATCConfiguration{ 538 "", 539 "", 540 ATCObjects{ 541 Package: []Package{ 542 {Name: "testPackage", IncludeSubpackages: true}, 543 {Name: "testPackage2", IncludeSubpackages: false}, 544 }, 545 SoftwareComponent: []SoftwareComponent{ 546 {Name: "testSoftwareComponent"}, 547 {Name: "testSoftwareComponent2"}, 548 }, 549 }, 550 abaputils.ObjectSet{}, 551 } 552 553 objectSet, err := getATCObjectSet(config) 554 555 assert.Equal(t, expectedObjectSet, objectSet) 556 assert.Equal(t, nil, err) 557 }) 558 t.Run("failure case: Test build body with example yaml config with only packages and no software components", func(t *testing.T) { 559 expectedObjectSet := `<obj:objectSet><obj:packages><obj:package value="testPackage" includeSubpackages="true"/><obj:package value="testPackage2" includeSubpackages="false"/></obj:packages></obj:objectSet>` 560 561 var err error 562 563 config := ATCConfiguration{ 564 "", 565 "", 566 ATCObjects{ 567 Package: []Package{ 568 {Name: "testPackage", IncludeSubpackages: true}, 569 {Name: "testPackage2", IncludeSubpackages: false}, 570 }, 571 }, 572 abaputils.ObjectSet{}, 573 } 574 575 objectSet, err := getATCObjectSet(config) 576 577 assert.Equal(t, expectedObjectSet, objectSet) 578 assert.Equal(t, nil, err) 579 }) 580 t.Run("success case: Test build body with example yaml config with no packages and only software components", func(t *testing.T) { 581 expectedObjectSet := `<obj:objectSet><obj:softwarecomponents><obj:softwarecomponent value="testSoftwareComponent"/><obj:softwarecomponent value="testSoftwareComponent2"/></obj:softwarecomponents></obj:objectSet>` 582 583 config := ATCConfiguration{ 584 "", 585 "", 586 ATCObjects{ 587 SoftwareComponent: []SoftwareComponent{ 588 {Name: "testSoftwareComponent"}, 589 {Name: "testSoftwareComponent2"}, 590 }, 591 }, 592 abaputils.ObjectSet{}, 593 } 594 595 objectSet, err := getATCObjectSet(config) 596 597 assert.Equal(t, expectedObjectSet, objectSet) 598 assert.Equal(t, nil, err) 599 }) 600 } 601 602 func TestGenerateHTMLDocument(t *testing.T) { 603 // Failure case is not needed --> all failing cases would be depended on parsedXML *Result which is covered in TestParseATCResult 604 t.Run("success case: html response", func(t *testing.T) { 605 expectedResult := "<!DOCTYPE html><html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>ATC Results</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>table,th,td {border: 1px solid black;border-collapse:collapse;}th,td{padding: 5px;text-align:left;font-size:medium;}</style></head><body><h1 style=\"text-align:left;font-size:large\">ATC Results</h1><table style=\"width:100%\"><tr><th>Severity</th><th>File</th><th>Message</th><th>Line</th><th>Checked by</th></tr><tr style=\"background-color: rgba(227,85,0)\"><td>error</td><td>testFile2</td><td>testMessage</td><td style=\"text-align:center\">1</td><td>sourceTester</td></tr><tr style=\"background-color: rgba(255,175,0, 0.75)\"><td>warning</td><td>testFile</td><td>testMessage2</td><td style=\"text-align:center\">2</td><td>sourceTester</td></tr><tr style=\"background-color: rgba(255,175,0, 0.2)\"><td>info</td><td>testFile</td><td>testMessage1</td><td style=\"text-align:center\">1</td><td>sourceTester</td></tr></table></body></html>" 606 607 bodyString := `<?xml version="1.0" encoding="UTF-8"?> 608 <checkstyle> 609 <file name="testFile"> 610 <error message="testMessage1" source="sourceTester" line="1" severity="info"> 611 </error> 612 <error message="testMessage2" source="sourceTester" line="2" severity="warning"> 613 </error> 614 </file> 615 <file name="testFile2"> 616 <error message="testMessage" source="sourceTester" line="1" severity="error"> 617 </error> 618 </file> 619 </checkstyle>` 620 621 parsedXML := new(Result) 622 err := xml.Unmarshal([]byte(bodyString), &parsedXML) 623 if assert.NoError(t, err) { 624 htmlDocumentResult := generateHTMLDocument(parsedXML) 625 assert.Equal(t, expectedResult, htmlDocumentResult) 626 } 627 }) 628 } 629 630 func TestResolveConfiguration(t *testing.T) { 631 t.Run("resolve atcConfig-yml with ATC Set", func(t *testing.T) { 632 expectedBodyString := "<?xml version=\"1.0\" encoding=\"UTF-8\"?><atc:runparameters xmlns:atc=\"http://www.sap.com/adt/atc\" xmlns:obj=\"http://www.sap.com/adt/objectset\" checkVariant=\"MY_TEST\" configuration=\"MY_CONFIG\"><obj:objectSet><obj:softwarecomponents><obj:softwarecomponent value=\"Z_TEST\"/><obj:softwarecomponent value=\"/DMO/SWC\"/></obj:softwarecomponents><obj:packages><obj:package value=\"Z_TEST\" includeSubpackages=\"false\"/><obj:package value=\"Z_TEST_TREE\" includeSubpackages=\"true\"/></obj:packages></obj:objectSet></atc:runparameters>" 633 config := abapEnvironmentRunATCCheckOptions{ 634 AtcConfig: "atc.yml", 635 } 636 637 dir := t.TempDir() 638 oldCWD, _ := os.Getwd() 639 _ = os.Chdir(dir) 640 // clean up tmp dir 641 defer func() { 642 _ = os.Chdir(oldCWD) 643 }() 644 645 yamlBody := `checkvariant: MY_TEST 646 configuration: MY_CONFIG 647 atcobjects: 648 package: 649 - name: Z_TEST 650 - name: Z_TEST_TREE 651 includesubpackage: true 652 softwarecomponent: 653 - name: Z_TEST 654 - name: /DMO/SWC 655 ` 656 657 err := os.WriteFile(config.AtcConfig, []byte(yamlBody), 0o644) 658 if assert.Equal(t, err, nil) { 659 bodyString, err := buildATCRequestBody(config) 660 assert.Equal(t, nil, err) 661 assert.Equal(t, expectedBodyString, bodyString) 662 } 663 }) 664 665 t.Run("resolve atcConfig-yml with OSL", func(t *testing.T) { 666 config := abapEnvironmentRunATCCheckOptions{ 667 AtcConfig: "atc.yml", 668 } 669 670 dir := t.TempDir() 671 oldCWD, _ := os.Getwd() 672 _ = os.Chdir(dir) 673 // clean up tmp dir 674 defer func() { 675 _ = os.Chdir(oldCWD) 676 }() 677 678 yamlBody := `checkvariant: MY_TEST 679 configuration: MY_CONFIG 680 objectset: 681 type: multiPropertySet 682 multipropertyset: 683 packages: 684 - name: Z_TEST 685 packagetrees: 686 - name: Z_TEST_TREE 687 softwarecomponents: 688 - name: Z_TEST 689 - name: /DMO/SWC 690 ` 691 expectedBodyString := "<?xml version=\"1.0\" encoding=\"UTF-8\"?><atc:runparameters xmlns:atc=\"http://www.sap.com/adt/atc\" xmlns:obj=\"http://www.sap.com/adt/objectset\" checkVariant=\"MY_TEST\" configuration=\"MY_CONFIG\"><osl:objectSet xsi:type=\"multiPropertySet\" xmlns:osl=\"http://www.sap.com/api/osl\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><osl:package name=\"Z_TEST\"/><osl:package name=\"Z_TEST_TREE\" includeSubpackages=\"true\"/><osl:softwareComponent name=\"Z_TEST\"/><osl:softwareComponent name=\"/DMO/SWC\"/></osl:objectSet></atc:runparameters>" 692 693 err := os.WriteFile(config.AtcConfig, []byte(yamlBody), 0o644) 694 if assert.Equal(t, err, nil) { 695 bodyString, err := buildATCRequestBody(config) 696 assert.Equal(t, nil, err) 697 assert.Equal(t, expectedBodyString, bodyString) 698 } 699 }) 700 701 t.Run("resolve repo-yml", func(t *testing.T) { 702 expectedBodyString := "<?xml version=\"1.0\" encoding=\"UTF-8\"?><atc:runparameters xmlns:atc=\"http://www.sap.com/adt/atc\" xmlns:obj=\"http://www.sap.com/adt/objectset\" checkVariant=\"ABAP_CLOUD_DEVELOPMENT_DEFAULT\"><obj:objectSet><obj:softwarecomponents><obj:softwarecomponent value=\"Z_TEST\"/><obj:softwarecomponent value=\"/DMO/SWC\"/></obj:softwarecomponents></obj:objectSet></atc:runparameters>" 703 config := abapEnvironmentRunATCCheckOptions{ 704 Repositories: "repo.yml", 705 } 706 707 dir := t.TempDir() 708 oldCWD, _ := os.Getwd() 709 _ = os.Chdir(dir) 710 // clean up tmp dir 711 defer func() { 712 _ = os.Chdir(oldCWD) 713 }() 714 715 yamlBody := `repositories: 716 - name: Z_TEST 717 - name: /DMO/SWC 718 ` 719 720 err := os.WriteFile(config.Repositories, []byte(yamlBody), 0o644) 721 if assert.Equal(t, err, nil) { 722 bodyString, err := buildATCRequestBody(config) 723 assert.Equal(t, nil, err) 724 assert.Equal(t, expectedBodyString, bodyString) 725 } 726 }) 727 728 t.Run("Missing config files", func(t *testing.T) { 729 config := abapEnvironmentRunATCCheckOptions{ 730 AtcConfig: "atc.yml", 731 } 732 733 bodyString, err := buildATCRequestBody(config) 734 assert.Equal(t, "Could not find atc.yml", err.Error()) 735 assert.Equal(t, "", bodyString) 736 }) 737 738 t.Run("Config file not specified", func(t *testing.T) { 739 config := abapEnvironmentRunATCCheckOptions{} 740 741 bodyString, err := buildATCRequestBody(config) 742 assert.Equal(t, "No configuration provided - please provide either an ATC configuration file or a repository configuration file", err.Error()) 743 assert.Equal(t, "", bodyString) 744 }) 745 }