package cmd
import (
"io/ioutil"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
func TestHostConfig(t *testing.T) {
t.Run("Check Host: ABAP Endpoint with HTTPS prefix", func(t *testing.T) {
config := abapEnvironmentRunATCCheckOptions{
Username: "testUser",
Password: "testPassword",
Host: "https://api.endpoint.com",
}
var con connectionDetailsHTTP
con, error := checkHost(config, con)
if error == nil {
assert.Equal(t, "testUser", con.User)
assert.Equal(t, "testPassword", con.Password)
assert.Equal(t, "https://api.endpoint.com", con.URL)
assert.Equal(t, "", con.XCsrfToken)
}
})
t.Run("Check Host: ABAP Endpoint without HTTPS prefix", func(t *testing.T) {
config := abapEnvironmentRunATCCheckOptions{
Username: "testUser",
Password: "testPassword",
Host: "api.endpoint.com",
}
var con connectionDetailsHTTP
con, error := checkHost(config, con)
if error == nil {
assert.Equal(t, "testUser", con.User)
assert.Equal(t, "testPassword", con.Password)
assert.Equal(t, "https://api.endpoint.com", con.URL)
assert.Equal(t, "", con.XCsrfToken)
}
})
t.Run("No host/ServiceKey configuration", func(t *testing.T) {
//Testing without CfOrg parameter
config := abapEnvironmentRunATCCheckOptions{
CfAPIEndpoint: "https://api.endpoint.com",
CfSpace: "testSpace",
CfServiceInstance: "testInstance",
CfServiceKeyName: "testServiceKey",
Username: "testUser",
Password: "testPassword",
}
var con connectionDetailsHTTP
con, err := checkHost(config, con)
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")
//Testing without ABAP Host
config = abapEnvironmentRunATCCheckOptions{
Username: "testUser",
Password: "testPassword",
}
con, err = checkHost(config, con)
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")
})
t.Run("Check Host: CF Service Key", func(t *testing.T) {
config := abapEnvironmentRunATCCheckOptions{
CfAPIEndpoint: "https://api.endpoint.com",
CfSpace: "testSpace",
CfOrg: "Test",
CfServiceInstance: "testInstance",
CfServiceKeyName: "testServiceKey",
Username: "testUser",
Password: "testPassword",
}
var con connectionDetailsHTTP
con, error := checkHost(config, con)
if error == nil {
assert.Equal(t, "", con.User)
assert.Equal(t, "", con.Password)
assert.Equal(t, "", con.URL)
assert.Equal(t, "", con.XCsrfToken)
}
})
}
func TestATCTrigger(t *testing.T) {
t.Run("Trigger ATC run test", func(t *testing.T) {
tokenExpected := "myToken"
client := &clientMock{
Body: `ATC trigger test`,
Token: tokenExpected,
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, error := runATC("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, resp.Header["X-Csrf-Token"][0])
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["Location"])
}
})
}
func TestFetchXcsrfToken(t *testing.T) {
t.Run("FetchXcsrfToken Test", func(t *testing.T) {
tokenExpected := "myToken"
client := &clientMock{
Body: `Xcsrf Token test`,
Token: tokenExpected,
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})
t.Run("failure case: fetch token", func(t *testing.T) {
tokenExpected := ""
client := &clientMock{
Body: `Xcsrf Token test`,
Token: "",
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})
}
func TestPollATCRun(t *testing.T) {
t.Run("ATC run Poll Test", func(t *testing.T) {
tokenExpected := "myToken"
client := &clientMock{
Body: `ATC Poll test`,
Token: tokenExpected,
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := pollATCRun(con, []byte(client.Body), client)
if err != nil {
assert.Equal(t, "", resp)
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")
}
})
}
func TestGetHTTPResponseATCRun(t *testing.T) {
t.Run("Get HTTP Response from ATC run Test", func(t *testing.T) {
client := &clientMock{
Body: `HTTP response test`,
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := getHTTPResponseATCRun("GET", con, []byte(client.Body), client)
defer resp.Body.Close()
if err == nil {
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"])
}
})
}
func TestGetResultATCRun(t *testing.T) {
t.Run("Get HTTP Response from ATC run Test", func(t *testing.T) {
client := &clientMock{
BodyList: []string{
`ATC result body`,
},
}
con := connectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := getResultATCRun("GET", con, []byte(client.Body), client)
defer resp.Body.Close()
if err == nil {
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"])
}
})
}
func TestParseATCResult(t *testing.T) {
t.Run("succes case: test parsing example XML result", func(t *testing.T) {
dir, err := ioutil.TempDir("", "test get result ATC run")
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)
}()
bodyString := `
`
body := []byte(bodyString)
err = parseATCResult(body)
assert.Equal(t, nil, err)
})
t.Run("failure case: parsing empty xml", func(t *testing.T) {
var bodyString string
body := []byte(bodyString)
err := parseATCResult(body)
assert.EqualError(t, err, "Parsing ATC result failed: Body is empty, can't parse empty body")
})
}
func TestBuildATCCheckBody(t *testing.T) {
t.Run("Test build body with no software component and package", func(t *testing.T) {
expectedpackagestring := ""
expectedsoftwarecomponentstring := ""
var err error
var config ATCconfig
var packageString, softwarecomponentString string
packageString, softwarecomponentString, err = buildATCCheckBody(config)
assert.Equal(t, expectedpackagestring, packageString)
assert.Equal(t, expectedsoftwarecomponentstring, softwarecomponentString)
assert.EqualError(t, err, "Error while parsing ATC run config. Please provide the packages and/or the software components to be checked! No Package or Software Component specified. Please provide either one or both of them")
})
t.Run("success case: Test build body with example yaml config", func(t *testing.T) {
expectedpackagestring := ""
expectedsoftwarecomponentstring := ""
var err error
var config ATCconfig
config = ATCconfig{
ATCObjects{
Package: []Package{
Package{Name: "testPackage", IncludeSubpackages: true},
Package{Name: "testPackage2", IncludeSubpackages: false},
},
SoftwareComponent: []SoftwareComponent{
SoftwareComponent{Name: "testSoftwareComponent"},
SoftwareComponent{Name: "testSoftwareComponent2"},
},
},
}
var packageString, softwarecomponentString string
packageString, softwarecomponentString, err = buildATCCheckBody(config)
assert.Equal(t, expectedpackagestring, packageString)
assert.Equal(t, expectedsoftwarecomponentstring, softwarecomponentString)
assert.Equal(t, nil, err)
})
t.Run("failure case: Test build body with example yaml config with only packages and no software components", func(t *testing.T) {
expectedpackagestring := ``
expectedsoftwarecomponentstring := ""
var err error
var config ATCconfig
config = ATCconfig{
ATCObjects{
Package: []Package{
Package{Name: "testPackage", IncludeSubpackages: true},
Package{Name: "testPackage2", IncludeSubpackages: false},
},
},
}
var packageString, softwarecomponentString string
packageString, softwarecomponentString, err = buildATCCheckBody(config)
assert.Equal(t, expectedpackagestring, packageString)
assert.Equal(t, expectedsoftwarecomponentstring, softwarecomponentString)
assert.Equal(t, nil, err)
})
t.Run("success case: Test build body with example yaml config with no packages and only software components", func(t *testing.T) {
expectedpackagestring := ""
expectedsoftwarecomponentstring := ``
var err error
var config ATCconfig
config = ATCconfig{
ATCObjects{
SoftwareComponent: []SoftwareComponent{
SoftwareComponent{Name: "testSoftwareComponent"},
SoftwareComponent{Name: "testSoftwareComponent2"},
},
},
}
var packageString, softwarecomponentString string
packageString, softwarecomponentString, err = buildATCCheckBody(config)
assert.Equal(t, expectedpackagestring, packageString)
assert.Equal(t, expectedsoftwarecomponentstring, softwarecomponentString)
assert.Equal(t, nil, err)
})
}