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  }