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  }