package abaputils import ( "fmt" "io/ioutil" "os" "testing" "github.com/SAP/jenkins-library/pkg/command" "github.com/SAP/jenkins-library/pkg/mock" "github.com/stretchr/testify/assert" ) func TestCloudFoundryGetAbapCommunicationInfo(t *testing.T) { t.Run("CF GetAbapCommunicationArrangementInfo - Error - parameters missing", func(t *testing.T) { //given options := AbapEnvironmentOptions{ //CfAPIEndpoint: "https://api.endpoint.com", CfSpace: "testSpace", CfOrg: "testOrg", CfServiceInstance: "testInstance", Username: "testUser", Password: "testPassword", CfServiceKeyName: "testServiceKeyName", } //when var connectionDetails ConnectionDetailsHTTP var err error var autils = AbapUtils{ Exec: &command.Command{}, } connectionDetails, err = autils.GetAbapCommunicationArrangementInfo(options, "") //then assert.Equal(t, "", connectionDetails.URL) assert.Equal(t, "", connectionDetails.User) assert.Equal(t, "", connectionDetails.Password) assert.Equal(t, "", connectionDetails.XCsrfToken) 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") assert.Error(t, err) }) t.Run("CF GetAbapCommunicationArrangementInfo - Error - reading service Key", func(t *testing.T) { //given options := AbapEnvironmentOptions{ CfAPIEndpoint: "https://api.endpoint.com", CfSpace: "testSpace", CfOrg: "testOrg", CfServiceInstance: "testInstance", Username: "testUser", Password: "testPassword", CfServiceKeyName: "testServiceKeyName", } //when var connectionDetails ConnectionDetailsHTTP var err error var autils = AbapUtils{ Exec: &command.Command{}, } connectionDetails, err = autils.GetAbapCommunicationArrangementInfo(options, "") //then assert.Equal(t, "", connectionDetails.URL) assert.Equal(t, "", connectionDetails.User) assert.Equal(t, "", connectionDetails.Password) assert.Equal(t, "", connectionDetails.XCsrfToken) assert.Error(t, err) }) t.Run("CF GetAbapCommunicationArrangementInfo - Success", func(t *testing.T) { //given const testURL = "https://testurl.com" const oDataURL = "/sap/opu/odata/sap/MANAGE_GIT_REPOSITORY/Pull" const username = "test_user" const password = "test_password" const serviceKey = ` cf comment test \n\n {"sap.cloud.service":"com.sap.cloud.abap","url": "` + testURL + `" ,"systemid":"H01","abap":{"username":"` + username + `","password":"` + password + `","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}` options := AbapEnvironmentOptions{ CfAPIEndpoint: "https://api.endpoint.com", CfSpace: "testSpace", CfOrg: "testOrg", CfServiceInstance: "testInstance", Username: "testUser", Password: "testPassword", CfServiceKeyName: "testServiceKeyName", } m := &mock.ExecMockRunner{} m.StdoutReturn = map[string]string{"cf service-key testInstance testServiceKeyName": serviceKey} var autils = AbapUtils{ Exec: m, } //when var connectionDetails ConnectionDetailsHTTP var err error connectionDetails, err = autils.GetAbapCommunicationArrangementInfo(options, oDataURL) //then assert.Equal(t, testURL+oDataURL, connectionDetails.URL) assert.Equal(t, username, connectionDetails.User) assert.Equal(t, password, connectionDetails.Password) assert.Equal(t, "", connectionDetails.XCsrfToken) assert.NoError(t, err) }) } func TestHostGetAbapCommunicationInfo(t *testing.T) { t.Run("HOST GetAbapCommunicationArrangementInfo - Success", func(t *testing.T) { //given const testURL = "https://testurl.com" const oDataURL = "/sap/opu/odata/sap/MANAGE_GIT_REPOSITORY/Pull" const username = "test_user" const password = "test_password" const serviceKey = ` cf comment test \n\n {"sap.cloud.service":"com.sap.cloud.abap","url": "` + testURL + `" ,"systemid":"XYZ","abap":{"username":"` + username + `","password":"` + password + `","communication_scenario_id": "SAP_COM_XYZ","communication_arrangement_id": "SK_testing","communication_system_id": "SK_testing","communication_inbound_user_id": "CC0000000000","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdtestKynaTqa32W"},"preserve_host_header": true}` options := AbapEnvironmentOptions{ Host: testURL, Username: username, Password: password, } m := &mock.ExecMockRunner{} m.StdoutReturn = map[string]string{"cf service-key testInstance testServiceKeyName": serviceKey} var autils = AbapUtils{ Exec: m, } //when var connectionDetails ConnectionDetailsHTTP var err error connectionDetails, err = autils.GetAbapCommunicationArrangementInfo(options, oDataURL) //then assert.Equal(t, testURL+oDataURL, connectionDetails.URL) assert.Equal(t, username, connectionDetails.User) assert.Equal(t, password, connectionDetails.Password) assert.Equal(t, "", connectionDetails.XCsrfToken) assert.NoError(t, err) }) t.Run("HOST GetAbapCommunicationArrangementInfo - Success - w/o https", func(t *testing.T) { //given const testURL = "testurl.com" const oDataURL = "/sap/opu/odata/sap/MANAGE_GIT_REPOSITORY/Pull" const username = "test_user" const password = "test_password" const serviceKey = ` cf comment test \n\n {"sap.cloud.service":"com.sap.cloud.abap","url": "` + testURL + `" ,"systemid":"H01","abap":{"username":"` + username + `","password":"` + password + `","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}` options := AbapEnvironmentOptions{ Host: testURL, Username: username, Password: password, } m := &mock.ExecMockRunner{} m.StdoutReturn = map[string]string{"cf service-key testInstance testServiceKeyName": serviceKey} var autils = AbapUtils{ Exec: m, } //when var connectionDetails ConnectionDetailsHTTP var err error connectionDetails, err = autils.GetAbapCommunicationArrangementInfo(options, oDataURL) //then assert.Equal(t, "https://"+testURL+oDataURL, connectionDetails.URL) assert.Equal(t, username, connectionDetails.User) assert.Equal(t, password, connectionDetails.Password) assert.Equal(t, "", connectionDetails.XCsrfToken) assert.NoError(t, err) }) } func TestReadServiceKeyAbapEnvironment(t *testing.T) { t.Run("CF ReadServiceKeyAbapEnvironment - Failed to login to Cloud Foundry", func(t *testing.T) { //given . options := AbapEnvironmentOptions{ Username: "testUser", Password: "testPassword", CfAPIEndpoint: "https://api.endpoint.com", CfSpace: "testSpace", CfOrg: "testOrg", CfServiceInstance: "testInstance", CfServiceKeyName: "testKey", } //when var abapKey AbapServiceKey var err error abapKey, err = ReadServiceKeyAbapEnvironment(options, &command.Command{}) //then assert.Equal(t, "", abapKey.Abap.Password) assert.Equal(t, "", abapKey.Abap.Username) assert.Equal(t, "", abapKey.Abap.CommunicationArrangementID) assert.Equal(t, "", abapKey.Abap.CommunicationScenarioID) assert.Equal(t, "", abapKey.Abap.CommunicationSystemID) assert.Equal(t, "", abapKey.Binding.Env) assert.Equal(t, "", abapKey.Binding.Type) assert.Equal(t, "", abapKey.Binding.ID) assert.Equal(t, "", abapKey.Binding.Version) assert.Equal(t, "", abapKey.SystemID) assert.Equal(t, "", abapKey.URL) assert.Error(t, err) }) } func TestTimeConverter(t *testing.T) { t.Run("Test example time", func(t *testing.T) { inputDate := "/Date(1585576809000+0000)/" expectedDate := "2020-03-30 14:00:09 +0000 UTC" result := ConvertTime(inputDate) assert.Equal(t, expectedDate, result.String(), "Dates do not match after conversion") }) t.Run("Test Unix time", func(t *testing.T) { inputDate := "/Date(0000000000000+0000)/" expectedDate := "1970-01-01 00:00:00 +0000 UTC" result := ConvertTime(inputDate) assert.Equal(t, expectedDate, result.String(), "Dates do not match after conversion") }) t.Run("Test unexpected format", func(t *testing.T) { inputDate := "/Date(0012300000001+0000)/" expectedDate := "1970-01-01 00:00:00 +0000 UTC" result := ConvertTime(inputDate) assert.Equal(t, expectedDate, result.String(), "Dates do not match after conversion") }) } func TestReadAddonDescriptor(t *testing.T) { t.Run("Test: success case", func(t *testing.T) { dir, err := ioutil.TempDir("", "test read addon descriptor") if err != nil { t.Fatal("Failed to create temporary directory") } oldCWD, _ := os.Getwd() _ = os.Chdir(dir) // clean up tmp dir defer func() { _ = os.Chdir(oldCWD) _ = os.RemoveAll(dir) }() body := `--- addonProduct: /DMO/myAddonProduct addonVersion: 3.1.4 addonUniqueId: myAddonId customerID: 1234 repositories: - name: /DMO/REPO_A tag: v-1.0.1-build-0001 branch: branchA version: 1.0.1 - name: /DMO/REPO_B tag: rel-2.1.1-build-0001 branch: branchB version: 2.1.1 ` file, _ := os.Create("filename.yaml") file.Write([]byte(body)) addonDescriptor, err := ReadAddonDescriptor("filename.yaml") assert.NoError(t, err) assert.Equal(t, `/DMO/myAddonProduct`, addonDescriptor.AddonProduct) assert.Equal(t, `3.1.4`, addonDescriptor.AddonVersion) assert.Equal(t, `myAddonId`, addonDescriptor.AddonUniqueID) assert.Equal(t, float64(1234), addonDescriptor.CustomerID) assert.Equal(t, ``, addonDescriptor.AddonSpsLevel) assert.Equal(t, `/DMO/REPO_A`, addonDescriptor.Repositories[0].Name) assert.Equal(t, `/DMO/REPO_B`, addonDescriptor.Repositories[1].Name) assert.Equal(t, `v-1.0.1-build-0001`, addonDescriptor.Repositories[0].Tag) assert.Equal(t, `rel-2.1.1-build-0001`, addonDescriptor.Repositories[1].Tag) assert.Equal(t, `branchA`, addonDescriptor.Repositories[0].Branch) assert.Equal(t, `branchB`, addonDescriptor.Repositories[1].Branch) assert.Equal(t, `1.0.1`, addonDescriptor.Repositories[0].Version) assert.Equal(t, `2.1.1`, addonDescriptor.Repositories[1].Version) assert.Equal(t, ``, addonDescriptor.Repositories[0].SpsLevel) assert.Equal(t, ``, addonDescriptor.Repositories[1].SpsLevel) }) t.Run("Test: file does not exist", func(t *testing.T) { _, err := ReadAddonDescriptor("filename.yaml") assert.EqualError(t, err, fmt.Sprintf("Could not find %v.", "filename.yaml")) }) }