github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/abap/build/bfw_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package build 5 6 import ( 7 "encoding/json" 8 "path" 9 "path/filepath" 10 "testing" 11 "time" 12 13 piperhttp "github.com/SAP/jenkins-library/pkg/http" 14 "github.com/SAP/jenkins-library/pkg/mock" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func testSetup(client piperhttp.Sender, buildID string) Build { 19 conn := new(Connector) 20 conn.Client = client 21 conn.DownloadClient = &DownloadClientMock{} 22 conn.Header = make(map[string][]string) 23 b := Build{ 24 Connector: *conn, 25 BuildID: buildID, 26 } 27 return b 28 } 29 30 func TestStart(t *testing.T) { 31 t.Run("Run start", func(t *testing.T) { 32 client := &ClMock{ 33 Token: "MyToken", 34 } 35 b := testSetup(client, "") 36 inputValues := Values{ 37 Values: []Value{ 38 { 39 ValueID: "PACKAGES", 40 Value: "/BUILD/CORE", 41 }, 42 { 43 ValueID: "season", 44 Value: "winter", 45 }, 46 }, 47 } 48 err := b.Start("test", inputValues) 49 assert.NoError(t, err) 50 assert.Equal(t, Accepted, b.RunState) 51 }) 52 } 53 54 func TestStartValueGeneration(t *testing.T) { 55 myValue := string(`{ "ARES_EC_ATTRIBUTES": [ { "ATTRIBUTE": "A", "VALUE": "B" } ] }`) 56 57 inputForPost := InputForPost{ 58 Phase: "HUGO", 59 Values: []Value{{ValueID: "myJson", Value: myValue}}, 60 } 61 62 importBody, err := json.Marshal(inputForPost) 63 assert.NoError(t, err) 64 assert.Equal(t, `{"phase":"HUGO","values":[{"value_id":"myJson","value":"{ \"ARES_EC_ATTRIBUTES\": [ { \"ATTRIBUTE\": \"A\", \"VALUE\": \"B\" } ] }"}]}`, string(importBody)) 65 } 66 67 func TestGet(t *testing.T) { 68 t.Run("Run Get", func(t *testing.T) { 69 b := testSetup(&ClMock{}, "ABIFNLDCSQPOVMXK4DNPBDRW2M") 70 err := b.Get() 71 assert.NoError(t, err) 72 assert.Equal(t, Finished, b.RunState) 73 assert.Equal(t, 0, len(b.Tasks)) 74 }) 75 } 76 77 func TestGetTasks(t *testing.T) { 78 t.Run("Run getTasks", func(t *testing.T) { 79 b := testSetup(&ClMock{}, "ABIFNLDCSQPOVMXK4DNPBDRW2M") 80 assert.Equal(t, 0, len(b.Tasks)) 81 err := b.getTasks() 82 assert.NoError(t, err) 83 assert.Equal(t, b.Tasks[0].TaskID, 0) 84 assert.Equal(t, b.Tasks[0].PluginClass, "") 85 assert.Equal(t, b.Tasks[1].TaskID, 1) 86 assert.Equal(t, b.Tasks[1].PluginClass, "/BUILD/CL_TEST_PLUGIN_OK") 87 }) 88 } 89 90 func TestGetLogs(t *testing.T) { 91 t.Run("Run getLogs", func(t *testing.T) { 92 b := testSetup(&ClMock{}, "ABIFNLDCSQPOVMXK4DNPBDRW2M") 93 err := b.getLogs() 94 assert.NoError(t, err) 95 assert.Equal(t, "I:/BUILD/LOG:000 ABAP Build Framework", b.Tasks[0].Logs[0].Logline) 96 assert.Equal(t, loginfo, b.Tasks[0].Logs[0].Msgty) 97 assert.Equal(t, "W:/BUILD/LOG:000 We can even have warnings!", b.Tasks[1].Logs[1].Logline) 98 assert.Equal(t, logwarning, b.Tasks[1].Logs[1].Msgty) 99 }) 100 } 101 102 func TestGetValues(t *testing.T) { 103 t.Run("Run getValues", func(t *testing.T) { 104 b := testSetup(&ClMock{}, "ABIFNLDCSQPOVMXK4DNPBDRW2M") 105 assert.Equal(t, 0, len(b.Values)) 106 err := b.GetValues() 107 assert.NoError(t, err) 108 assert.Equal(t, 4, len(b.Values)) 109 assert.Equal(t, "PHASE", b.Values[0].ValueID) 110 assert.Equal(t, "test1", b.Values[0].Value) 111 assert.Equal(t, "PACKAGES", b.Values[1].ValueID) 112 assert.Equal(t, "/BUILD/CORE", b.Values[1].Value) 113 assert.Equal(t, "season", b.Values[2].ValueID) 114 assert.Equal(t, "winter", b.Values[2].Value) 115 assert.Equal(t, "SUN", b.Values[3].ValueID) 116 assert.Equal(t, "FLOWER", b.Values[3].Value) 117 }) 118 } 119 120 func TestGetResults(t *testing.T) { 121 t.Run("Run getResults", func(t *testing.T) { 122 b := testSetup(&ClMock{}, "ABIFNLDCSQPOVMXK4DNPBDRW2M") 123 err := b.GetResults() 124 assert.NoError(t, err) 125 assert.Equal(t, 1, len(b.Tasks[0].Results)) 126 assert.Equal(t, 2, len(b.Tasks[1].Results)) 127 assert.Equal(t, "image/jpeg", b.Tasks[1].Results[0].Mimetype) 128 assert.Equal(t, "application/octet-stream", b.Tasks[1].Results[1].Mimetype) 129 130 _, err = b.GetResult("does_not_exist") 131 assert.Error(t, err) 132 r, err := b.GetResult("SAR_XML") 133 assert.Equal(t, "application/octet-stream", r.Mimetype) 134 assert.NoError(t, err) 135 }) 136 } 137 138 func TestPoll(t *testing.T) { 139 //arrange global 140 build := new(Build) 141 conn := new(Connector) 142 conn.MaxRuntime = time.Duration(1 * time.Second) 143 conn.PollingInterval = time.Duration(1 * time.Microsecond) 144 conn.Baseurl = "/sap/opu/odata/BUILD/CORE_SRV" 145 t.Run("Normal Poll", func(t *testing.T) { 146 //arrange 147 build.BuildID = "AKO22FYOFYPOXHOBVKXUTX3A3Q" 148 mc := NewMockClient() 149 mc.AddData(buildGet1) 150 mc.AddData(buildGet2) 151 conn.Client = &mc 152 build.Connector = *conn 153 //act 154 err := build.Poll() 155 //assert 156 assert.NoError(t, err) 157 }) 158 t.Run("Poll runstate failed", func(t *testing.T) { 159 //arrange 160 build.BuildID = "AKO22FYOFYPOXHOBVKXUTX3A3Q" 161 mc := NewMockClient() 162 mc.AddData(buildGet1) 163 mc.AddData(buildGetRunStateFailed) 164 conn.Client = &mc 165 build.Connector = *conn 166 //act 167 err := build.Poll() 168 //assert 169 assert.NoError(t, err) 170 }) 171 t.Run("Poll timeout", func(t *testing.T) { 172 //arrange 173 build.BuildID = "AKO22FYOFYPOXHOBVKXUTX3A3Q" 174 conn.MaxRuntime = time.Duration(1 * time.Microsecond) 175 conn.PollingInterval = time.Duration(1 * time.Microsecond) 176 mc := NewMockClient() 177 mc.AddData(buildGet1) 178 mc.AddData(buildGet1) 179 mc.AddData(buildGet2) 180 conn.Client = &mc 181 build.Connector = *conn 182 //act 183 err := build.Poll() 184 //assert 185 assert.Error(t, err) 186 }) 187 } 188 189 func TestEvaluteIfBuildSuccessful(t *testing.T) { 190 //arrange global 191 build := new(Build) 192 treatWarningsAsError := false 193 t.Run("No error", func(t *testing.T) { 194 //arrange 195 build.RunState = Finished 196 build.ResultState = successful 197 //act 198 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 199 //assert 200 assert.NoError(t, err) 201 }) 202 t.Run("RunState failed => Error", func(t *testing.T) { 203 //arrange 204 build.RunState = Failed 205 //act 206 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 207 //assert 208 assert.Error(t, err) 209 }) 210 t.Run("ResultState aborted => Error", func(t *testing.T) { 211 //arrange 212 build.RunState = Finished 213 build.ResultState = aborted 214 //act 215 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 216 //assert 217 assert.Error(t, err) 218 }) 219 t.Run("ResultState erroneous => Error", func(t *testing.T) { 220 //arrange 221 build.RunState = Finished 222 build.ResultState = erroneous 223 //act 224 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 225 //assert 226 assert.Error(t, err) 227 }) 228 t.Run("ResultState warning, treatWarningsAsError false => No error", func(t *testing.T) { 229 //arrange 230 build.RunState = Finished 231 build.ResultState = warning 232 //act 233 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 234 //assert 235 assert.NoError(t, err) 236 }) 237 t.Run("ResultState warning, treatWarningsAsError true => error", func(t *testing.T) { 238 //arrange 239 build.RunState = Finished 240 build.ResultState = warning 241 treatWarningsAsError = true 242 //act 243 err := build.EvaluteIfBuildSuccessful(treatWarningsAsError) 244 //assert 245 assert.Error(t, err) 246 }) 247 } 248 249 func TestDownloadWithFilenamePrefixAndTargetDirectory(t *testing.T) { 250 //arrange global 251 result := new(Result) 252 result.BuildID = "123456789" 253 result.TaskID = 1 254 result.Name = "MyFile" 255 conn := new(Connector) 256 conn.DownloadClient = &DownloadClientMock{} 257 result.connector = *conn 258 t.Run("Download without extension", func(t *testing.T) { 259 //arrange 260 basePath := "" 261 filenamePrefix := "" 262 //act 263 err := result.DownloadWithFilenamePrefixAndTargetDirectory(basePath, filenamePrefix) 264 //assert 265 assert.NoError(t, err) 266 assert.Equal(t, "MyFile", result.SavedFilename) 267 assert.Equal(t, "MyFile", result.DownloadPath) 268 }) 269 t.Run("Download with extensions", func(t *testing.T) { 270 //arrange 271 basePath := "MyDir" 272 filenamePrefix := "SuperFile_" 273 //act 274 err := result.DownloadWithFilenamePrefixAndTargetDirectory(basePath, filenamePrefix) 275 //assert 276 assert.NoError(t, err) 277 assert.Equal(t, "SuperFile_MyFile", result.SavedFilename) 278 downloadPath := filepath.Join(path.Base(basePath), path.Base("SuperFile_MyFile")) 279 assert.Equal(t, downloadPath, result.DownloadPath) 280 }) 281 t.Run("Download with parameter", func(t *testing.T) { 282 //arrange 283 basePath := "{BuildID}" 284 filenamePrefix := "{taskid}" 285 //act 286 err := result.DownloadWithFilenamePrefixAndTargetDirectory(basePath, filenamePrefix) 287 //assert 288 assert.NoError(t, err) 289 assert.Equal(t, "1MyFile", result.SavedFilename) 290 downloadPath := filepath.Join(path.Base("123456789"), path.Base("1MyFile")) 291 assert.Equal(t, downloadPath, result.DownloadPath) 292 }) 293 } 294 295 func TestDownloadAllResults(t *testing.T) { 296 //arrange global 297 build := GetMockBuildTestDownloadPublish() 298 t.Run("Download without extension", func(t *testing.T) { 299 //arrange 300 basePath := "" 301 filenamePrefix := "" 302 //act 303 err := build.DownloadAllResults(basePath, filenamePrefix) 304 //assert 305 assert.NoError(t, err) 306 assert.Equal(t, "", build.Tasks[0].Results[0].SavedFilename) 307 assert.Equal(t, "", build.Tasks[0].Results[0].DownloadPath) 308 309 assert.Equal(t, "File1", build.Tasks[1].Results[0].SavedFilename) 310 assert.Equal(t, "File1", build.Tasks[1].Results[0].DownloadPath) 311 312 assert.Equal(t, "File2", build.Tasks[1].Results[1].SavedFilename) 313 assert.Equal(t, "File2", build.Tasks[1].Results[1].DownloadPath) 314 }) 315 t.Run("Download with extension", func(t *testing.T) { 316 //arrange 317 basePath := "" 318 filenamePrefix := "SuperFile_" 319 //act 320 err := build.DownloadAllResults(basePath, filenamePrefix) 321 //assert 322 assert.NoError(t, err) 323 assert.Equal(t, "", build.Tasks[0].Results[0].SavedFilename) 324 assert.Equal(t, "", build.Tasks[0].Results[0].DownloadPath) 325 326 assert.Equal(t, "SuperFile_File1", build.Tasks[1].Results[0].SavedFilename) 327 assert.Equal(t, "SuperFile_File1", build.Tasks[1].Results[0].DownloadPath) 328 329 assert.Equal(t, "SuperFile_File2", build.Tasks[1].Results[1].SavedFilename) 330 assert.Equal(t, "SuperFile_File2", build.Tasks[1].Results[1].DownloadPath) 331 }) 332 } 333 334 func TestDownloadResults(t *testing.T) { 335 //arrange global 336 build := GetMockBuildTestDownloadPublish() 337 t.Run("Download existing", func(t *testing.T) { 338 //arrange 339 basePath := "" 340 filenamePrefix := "" 341 filenames := []string{"File1", "File3"} 342 //act 343 err := build.DownloadResults(filenames, basePath, filenamePrefix) 344 //assert 345 assert.NoError(t, err) 346 assert.Equal(t, "", build.Tasks[0].Results[0].SavedFilename) 347 assert.Equal(t, "", build.Tasks[0].Results[0].DownloadPath) 348 349 assert.Equal(t, "File1", build.Tasks[1].Results[0].SavedFilename) 350 assert.Equal(t, "File1", build.Tasks[1].Results[0].DownloadPath) 351 352 assert.Equal(t, "", build.Tasks[1].Results[1].SavedFilename) 353 assert.Equal(t, "", build.Tasks[1].Results[1].DownloadPath) 354 355 assert.Equal(t, "File3", build.Tasks[1].Results[2].SavedFilename) 356 assert.Equal(t, "File3", build.Tasks[1].Results[2].DownloadPath) 357 }) 358 t.Run("Try to download non existing", func(t *testing.T) { 359 //arrange 360 basePath := "" 361 filenamePrefix := "" 362 filenames := []string{"File1", "File4"} 363 //act 364 err := build.DownloadResults(filenames, basePath, filenamePrefix) 365 //assert 366 assert.Error(t, err) 367 assert.Equal(t, "", build.Tasks[0].Results[0].SavedFilename) 368 assert.Equal(t, "", build.Tasks[0].Results[0].DownloadPath) 369 370 assert.Equal(t, "File1", build.Tasks[1].Results[0].SavedFilename) 371 assert.Equal(t, "File1", build.Tasks[1].Results[0].DownloadPath) 372 373 assert.Equal(t, "", build.Tasks[1].Results[1].SavedFilename) 374 assert.Equal(t, "", build.Tasks[1].Results[1].DownloadPath) 375 }) 376 } 377 378 func TestPublishAllDownloadedResults(t *testing.T) { 379 t.Run("Something was downloaded", func(t *testing.T) { 380 //arrange 381 build := GetMockBuildTestDownloadPublish() 382 files := mock.FilesMock{} 383 build.Tasks[1].Results[0].SavedFilename = "File1" 384 build.Tasks[1].Results[0].DownloadPath = "Dir1/File1" 385 build.Tasks[1].Results[2].SavedFilename = "File3" 386 build.Tasks[1].Results[2].DownloadPath = "File3" 387 //act 388 build.PublishAllDownloadedResults("MyStep", &files) 389 //assert 390 assert.True(t, files.HasFile("/MyStep_reports.json")) 391 assert.True(t, files.HasFile("/MyStep_links.json")) 392 }) 393 t.Run("Nothing was downloaded", func(t *testing.T) { 394 //arrange 395 build := GetMockBuildTestDownloadPublish() 396 files := mock.FilesMock{} 397 //act 398 build.PublishAllDownloadedResults("MyStep", &files) 399 //assert 400 assert.False(t, files.HasFile("/MyStep_reports.json")) 401 assert.False(t, files.HasFile("/MyStep_links.json")) 402 }) 403 } 404 405 func TestPublishDownloadedResults(t *testing.T) { 406 filenames := []string{"File1", "File3"} 407 t.Run("Publish downloaded files", func(t *testing.T) { 408 //arrange 409 build := GetMockBuildTestDownloadPublish() 410 files := mock.FilesMock{} 411 build.Tasks[1].Results[0].SavedFilename = "SuperFile_File1" 412 build.Tasks[1].Results[0].DownloadPath = "Dir1/SuperFile_File1" 413 build.Tasks[1].Results[2].SavedFilename = "File3" 414 build.Tasks[1].Results[2].DownloadPath = "File3" 415 //act 416 err := build.PublishDownloadedResults("MyStep", filenames, &files) 417 //assert 418 assert.NoError(t, err) 419 420 assert.True(t, files.HasFile("/MyStep_reports.json")) 421 assert.True(t, files.HasFile("/MyStep_links.json")) 422 423 }) 424 t.Run("Try to publish file which was not downloaded", func(t *testing.T) { 425 //arrange 426 build := GetMockBuildTestDownloadPublish() 427 files := mock.FilesMock{} 428 build.Tasks[1].Results[0].SavedFilename = "SuperFile_File1" 429 build.Tasks[1].Results[0].DownloadPath = "Dir1/SuperFile_File1" 430 //act 431 err := build.PublishDownloadedResults("MyStep", filenames, &files) 432 //assert 433 assert.Error(t, err) 434 }) 435 }