1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/cmd/abapEnvironmentRunAUnitTest_test.go
Dominik Lendle f188979412
Add html processing to AUnit stage/step (#3302)
* change return after files are persisted & Change logging

* html processing

* Extend step parameters

* Add documentation

* html processing

* add generateHTML flag to general

* test adaptions

* step metadata corrections

* adapt formatting

* Update documentation/docs/pipelines/abapEnvironment/extensibility.md

Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com>

* Update documentation/docs/pipelines/abapEnvironment/extensibility.md

Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com>

* adapt unit tests

Co-authored-by: Daniel Mieg <56156797+DanielMieg@users.noreply.github.com>
2021-12-13 16:39:32 +01:00

608 lines
25 KiB
Go

package cmd
import (
"bytes"
"encoding/xml"
"errors"
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/SAP/jenkins-library/pkg/abaputils"
"github.com/SAP/jenkins-library/pkg/mock"
"github.com/stretchr/testify/assert"
)
type abapEnvironmentRunAUnitTestMockUtils struct {
*mock.ExecMockRunner
*mock.FilesMock
}
func newAbapEnvironmentRunAUnitTestTestsUtils() abapEnvironmentRunAUnitTestMockUtils {
utils := abapEnvironmentRunAUnitTestMockUtils{
ExecMockRunner: &mock.ExecMockRunner{},
FilesMock: &mock.FilesMock{},
}
return utils
}
func TestBuildAUnitTestBody(t *testing.T) {
t.Parallel()
t.Run("Test AUnit test run body with no data", func(t *testing.T) {
t.Parallel()
expectedmetadataString := ""
expectedoptionsString := ""
expectedobjectSetString := ""
var err error
var config AUnitConfig
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.EqualError(t, err, "Error while parsing AUnit test run config. No title for the AUnit run has been provided. Please configure an appropriate title for the respective test run")
})
t.Run("Test AUnit test run body with example yaml config", func(t *testing.T) {
t.Parallel()
expectedmetadataString := `<aunit:run title="Test Title" context="Test Context" xmlns:aunit="http://www.sap.com/adt/api/aunit">`
expectedoptionsString := `<aunit:options><aunit:measurements type="none"/><aunit:scope ownTests="false" foreignTests="false"/><aunit:riskLevel harmless="false" dangerous="false" critical="false"/><aunit:duration short="false" medium="false" long="false"/></aunit:options>`
expectedobjectSetString := `<osl:objectSet xsi:type="testSet" xmlns:osl="http://www.sap.com/api/osl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><osl:set xsi:type="testSet"><osl:package name="TestPackage" includeSubpackages="false"/><osl:object name="TestObject" type="CLAS"/></osl:set></osl:objectSet>`
var err error
var config AUnitConfig
config = AUnitConfig{
Title: "Test Title",
Context: "Test Context",
Options: AUnitOptions{
Measurements: "none",
Scope: Scope{
OwnTests: new(bool),
ForeignTests: new(bool),
},
RiskLevel: RiskLevel{
Harmless: new(bool),
Dangerous: new(bool),
Critical: new(bool),
},
Duration: Duration{
Short: new(bool),
Medium: new(bool),
Long: new(bool),
},
},
ObjectSet: []ObjectSet{{
Type: "testSet",
Set: []Set{{
Type: "testSet",
PackageSet: []AUnitPackage{{
Name: "TestPackage",
IncludeSubpackages: new(bool),
}},
FlatObjectSet: []AUnitObject{{
Name: "TestObject",
Type: "CLAS",
}},
}},
}},
}
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.Equal(t, nil, err)
//assert.EqualError(t, err, "Error while parsing AUnit test run config. No title for the AUnit run has been provided. Please configure an appropriate title for the respective test run")
})
t.Run("Test AUnit test run body with example yaml config fail: no Title", func(t *testing.T) {
t.Parallel()
expectedmetadataString := ""
expectedoptionsString := ""
expectedobjectSetString := ""
var err error
var config AUnitConfig
config = AUnitConfig{}
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.EqualError(t, err, "Error while parsing AUnit test run config. No title for the AUnit run has been provided. Please configure an appropriate title for the respective test run")
})
t.Run("Test AUnit test run body with example yaml config fail: no Context", func(t *testing.T) {
t.Parallel()
expectedmetadataString := ""
expectedoptionsString := ""
expectedobjectSetString := ""
var err error
var config AUnitConfig
config = AUnitConfig{Title: "Test"}
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.EqualError(t, err, "Error while parsing AUnit test run config. No context for the AUnit run has been provided. Please configure an appropriate context for the respective test run")
})
t.Run("Test AUnit test run body with example yaml config fail: no Options", func(t *testing.T) {
t.Parallel()
expectedmetadataString := ""
expectedoptionsString := ""
expectedobjectSetString := ""
var err error
var config AUnitConfig
config = AUnitConfig{Title: "Test", Context: "Test"}
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.EqualError(t, err, "Error while parsing AUnit test run config. No options have been provided. Please configure the options for the respective test run")
})
t.Run("Test AUnit test run body with example yaml config fail: no ObjectSet", func(t *testing.T) {
t.Parallel()
expectedmetadataString := ""
expectedoptionsString := ""
expectedobjectSetString := ""
var err error
var config AUnitConfig
config = AUnitConfig{Title: "Test", Context: "Test", Options: AUnitOptions{Measurements: "Test"}}
var metadataString, optionsString, objectSetString string
metadataString, optionsString, objectSetString, err = buildAUnitTestBody(config)
assert.Equal(t, expectedmetadataString, metadataString)
assert.Equal(t, expectedoptionsString, optionsString)
assert.Equal(t, expectedobjectSetString, objectSetString)
assert.EqualError(t, err, "Error while parsing AUnit test run object set config. No object set has been provided. Please configure the set of objects you want to be checked for the respective test run")
})
}
func TestParseAUnitResult(t *testing.T) {
t.Parallel()
t.Run("succes case: test parsing example XML result", func(t *testing.T) {
t.Parallel()
dir, err := ioutil.TempDir("", "test get result AUnit test 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 := `<?xml version="1.0" encoding="utf-8"?><testsuites title="My AUnit run" system="TST" client="100" executedBy="TESTUSER" time="000.000" timestamp="2021-01-01T00:00:00Z" failures="2" errors="2" skipped="0" asserts="0" tests="2"><testsuite name="" tests="2" failures="2" errors="0" skipped="0" asserts="0" package="testpackage" timestamp="2021-01-01T00:00:00ZZ" time="0.000" hostname="test"><testcase classname="test" name="execute" time="0.000" asserts="2"><failure message="testMessage1" type="Assert Failure">Test1</failure><failure message="testMessage2" type="Assert Failure">Test2</failure></testcase></testsuite></testsuites>`
body := []byte(bodyString)
err = parseAUnitResult(body, "AUnitResults.xml", false)
assert.Equal(t, nil, err)
})
t.Run("succes case: test parsing empty AUnit run XML result", func(t *testing.T) {
t.Parallel()
dir, err := ioutil.TempDir("", "test get result AUnit test 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 := `<?xml version="1.0" encoding="UTF-8"?>`
body := []byte(bodyString)
err = parseAUnitResult(body, "AUnitResults.xml", false)
assert.Equal(t, nil, err)
})
t.Run("failure case: parsing empty xml", func(t *testing.T) {
t.Parallel()
var bodyString string
body := []byte(bodyString)
err := parseAUnitResult(body, "AUnitResults.xml", false)
assert.EqualError(t, err, "Parsing AUnit result failed: Body is empty, can't parse empty body")
})
}
func TestGetResultAUnitRun(t *testing.T) {
t.Parallel()
t.Run("Get HTTP Response from AUnit test run Test", func(t *testing.T) {
t.Parallel()
client := &abaputils.ClientMock{
Body: `AUnit test result body`,
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := getResultAUnitRun("GET", con, []byte(client.Body), client)
defer resp.Body.Close()
if assert.Equal(t, nil, err) {
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
newStr := buf.String()
assert.Equal(t, "AUnit test result body", newStr)
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"])
}
})
t.Run("Get HTTP Response from AUnit test run Test Failure", func(t *testing.T) {
t.Parallel()
client := &abaputils.ClientMock{
Body: `AUnit test result body`,
BodyList: []string{},
StatusCode: 400,
Error: fmt.Errorf("%w", errors.New("Test fail")),
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := getResultAUnitRun("GET", con, []byte(client.Body), client)
defer resp.Body.Close()
if assert.EqualError(t, err, "Getting AUnit run results failed: Test fail") {
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
newStr := buf.String()
assert.Equal(t, "AUnit test result body", newStr)
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, 400, resp.StatusCode)
assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"])
}
})
}
func TestRunAbapEnvironmentRunAUnitTest(t *testing.T) {
t.Parallel()
t.Run("FetchXcsrfToken Test", func(t *testing.T) {
t.Parallel()
tokenExpected := "myToken"
client := &abaputils.ClientMock{
Body: `Xcsrf Token test`,
Token: tokenExpected,
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, error := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, error) {
assert.Equal(t, tokenExpected, token)
}
})
t.Run("failure case: fetch token", func(t *testing.T) {
t.Parallel()
tokenExpected := ""
client := &abaputils.ClientMock{
Body: `Xcsrf Token test`,
Token: "",
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, error := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, error) {
assert.Equal(t, tokenExpected, token)
}
})
t.Run("AUnit test run Poll Test", func(t *testing.T) {
t.Parallel()
tokenExpected := "myToken"
client := &abaputils.ClientMock{
Body: `<?xml version="1.0" encoding="utf-8"?><aunit:run xmlns:aunit="http://www.sap.com/adt/api/aunit"><aunit:progress status="FINISHED"/><aunit:time/><atom:link href="/sap/bc/adt/api/abapunit/results/test" rel="http://www.sap.com/adt/relations/api/abapunit/run-result" type="application/vnd.sap.adt.api.junit.run-result.v1xml" title="JUnit Run Result" xmlns:atom="http://www.w3.org/2005/Atom"/></aunit:run>`,
Token: tokenExpected,
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := pollAUnitRun(con, []byte(client.Body), client)
if assert.Equal(t, nil, err) {
assert.Equal(t, "/sap/bc/adt/api/abapunit/results/test", resp)
}
})
t.Run("AUnit test run Poll Test Fail", func(t *testing.T) {
t.Parallel()
tokenExpected := "myToken"
client := &abaputils.ClientMock{
Body: `<?xml version="1.0" encoding="utf-8"?><aunit:run xmlns:aunit="http://www.sap.com/adt/api/aunit"><aunit:progress status="Not Created"/><aunit:time/><atom:link href="/sap/bc/adt/api/abapunit/results/test" rel="http://www.sap.com/adt/relations/api/abapunit/run-result" type="application/vnd.sap.adt.api.junit.run-result.v1xml" title="JUnit Run Result" xmlns:atom="http://www.w3.org/2005/Atom"/></aunit:run>`,
Token: tokenExpected,
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := pollAUnitRun(con, []byte(client.Body), client)
if assert.Equal(t, nil, err) {
assert.Equal(t, "", resp)
}
})
t.Run("Get HTTP Response from AUnit test run Test", func(t *testing.T) {
t.Parallel()
client := &abaputils.ClientMock{
Body: `HTTP response test`,
}
con := abaputils.ConnectionDetailsHTTP{
User: "Test",
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
fmt.Println("Body:" + string([]byte(client.Body)))
resp, err := getHTTPResponseAUnitRun("GET", con, []byte(client.Body), client)
defer resp.Body.Close()
if assert.Equal(t, nil, err) {
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
newStr := buf.String()
assert.Equal(t, "HTTP response test", newStr)
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["X-Crsf-Token"])
}
})
}
func TestGenerateHTMLDocumentAUnit(t *testing.T) {
t.Parallel()
t.Run("Test empty XML Result", func(t *testing.T) {
t.Parallel()
expectedString := `<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><title>AUnit Results</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style>table,th,td {border-collapse:collapse;}th,td{padding: 5px;text-align:left;font-size:medium;}</style></head><body><h1 style="text-align:left;font-size:large">AUnit Results</h1><table><tr><th>Run title</th><td style="padding-right: 20px"></td><th>System</th><td style="padding-right: 20px"></td><th>Client</th><td style="padding-right: 20px"></td><th>ExecutedBy</th><td style="padding-right: 20px"></td><th>Duration</th><td style="padding-right: 20px">s</td><th>Timestamp</th><td style="padding-right: 20px"></td></tr><tr><th>Failures</th><td style="padding-right: 20px"></td><th>Errors</th><td style="padding-right: 20px"></td><th>Skipped</th><td style="padding-right: 20px"></td><th>Asserts</th><td style="padding-right: 20px"></td><th>Tests</th><td style="padding-right: 20px"></td></tr></table><br><table style="width:100%; border: 1px solid black""><tr style="border: 1px solid black"><th style="border: 1px solid black">Severity</th><th style="border: 1px solid black">File</th><th style="border: 1px solid black">Message</th><th style="border: 1px solid black">Type</th><th style="border: 1px solid black">Text</th></tr><tr><td colspan="5"><b>There are no AUnit findings to be displayed</b></td></tr></table></body></html>`
result := AUnitResult{}
resultString := generateHTMLDocumentAUnit(&result)
assert.Equal(t, expectedString, resultString)
})
t.Run("Test AUnit XML Result", func(t *testing.T) {
t.Parallel()
expectedString := `<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><title>AUnit Results</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style>table,th,td {border-collapse:collapse;}th,td{padding: 5px;text-align:left;font-size:medium;}</style></head><body><h1 style="text-align:left;font-size:large">AUnit Results</h1><table><tr><th>Run title</th><td style="padding-right: 20px">Test title</td><th>System</th><td style="padding-right: 20px">Test system</td><th>Client</th><td style="padding-right: 20px">000</td><th>ExecutedBy</th><td style="padding-right: 20px">CC00000</td><th>Duration</th><td style="padding-right: 20px">0.15s</td><th>Timestamp</th><td style="padding-right: 20px">2021-00-00T00:00:00Z</td></tr><tr><th>Failures</th><td style="padding-right: 20px">4</td><th>Errors</th><td style="padding-right: 20px">4</td><th>Skipped</th><td style="padding-right: 20px">4</td><th>Asserts</th><td style="padding-right: 20px">12</td><th>Tests</th><td style="padding-right: 20px">12</td></tr></table><br><table style="width:100%; border: 1px solid black""><tr style="border: 1px solid black"><th style="border: 1px solid black">Severity</th><th style="border: 1px solid black">File</th><th style="border: 1px solid black">Message</th><th style="border: 1px solid black">Type</th><th style="border: 1px solid black">Text</th></tr><tr style="background-color: grey"><td colspan="5"><b>Testcase: my_test for class ZCL_my_test</b></td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testMessage</td><td style="border: 1px solid black">Assert Error</td><td style="border: 1px solid black">testError</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testMessage2</td><td style="border: 1px solid black">Assert Error2</td><td style="border: 1px solid black">testError2</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testMessage</td><td style="border: 1px solid black">Assert Failure</td><td style="border: 1px solid black">testFailure</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testMessage2</td><td style="border: 1px solid black">Assert Failure2</td><td style="border: 1px solid black">testFailure2</td></tr><tr style="background-color: rgba(255,175,0, 0.2)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testSkipped</td><td style="border: 1px solid black">-</td><td style="border: 1px solid black">testSkipped</td></tr><tr style="background-color: rgba(255,175,0, 0.2)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test</td><td style="border: 1px solid black">testSkipped2</td><td style="border: 1px solid black">-</td><td style="border: 1px solid black">testSkipped2</td></tr><tr style="background-color: grey"><td colspan="5"><b>Testcase: my_test2 for class ZCL_my_test2</b></td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testMessage3</td><td style="border: 1px solid black">Assert Error3</td><td style="border: 1px solid black">testError3</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testMessage4</td><td style="border: 1px solid black">Assert Error4</td><td style="border: 1px solid black">testError4</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testMessage5</td><td style="border: 1px solid black">Assert Failure5</td><td style="border: 1px solid black">testFailure5</td></tr><tr style="background-color: rgba(227,85,0)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testMessage6</td><td style="border: 1px solid black">Assert Failure6</td><td style="border: 1px solid black">testFailure6</td></tr><tr style="background-color: rgba(255,175,0, 0.2)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testSkipped7</td><td style="border: 1px solid black">-</td><td style="border: 1px solid black">testSkipped7</td></tr><tr style="background-color: rgba(255,175,0, 0.2)"><td style="border: 1px solid black">Failure</td><td style="border: 1px solid black">ZCL_my_test2</td><td style="border: 1px solid black">testSkipped8</td><td style="border: 1px solid black">-</td><td style="border: 1px solid black">testSkipped8</td></tr></table></body></html>`
result := AUnitResult{
XMLName: xml.Name{Space: "testSpace", Local: "testLocal"},
Title: "Test title",
System: "Test system",
Client: "000",
ExecutedBy: "CC00000",
Time: "0.15",
Timestamp: "2021-00-00T00:00:00Z",
Failures: "4",
Errors: "4",
Skipped: "4",
Asserts: "12",
Tests: "12",
Testsuite: struct {
Tests string `xml:"tests,attr"`
Asserts string `xml:"asserts,attr"`
Skipped string `xml:"skipped,attr"`
Errors string `xml:"errors,attr"`
Failures string `xml:"failures,attr"`
Timestamp string `xml:"timestamp,attr"`
Time string `xml:"time,attr"`
Hostname string `xml:"hostname,attr"`
Package string `xml:"package,attr"`
Name string `xml:"name,attr"`
Testcase []struct {
Asserts string `xml:"asserts,attr"`
Time string `xml:"time,attr"`
Name string `xml:"name,attr"`
Classname string `xml:"classname,attr"`
Error []struct {
Text string `xml:",chardata"`
Type string `xml:"type,attr"`
Message string `xml:"message,attr"`
} `xml:"error"`
Failure []struct {
Text string `xml:",chardata"`
Type string `xml:"type,attr"`
Message string `xml:"message,attr"`
} `xml:"failure"`
Skipped []struct {
Text string `xml:",chardata"`
Message string `xml:"message,attr"`
} `xml:"skipped"`
} `xml:"testcase"`
}{
Tests: "6",
Asserts: "4",
Skipped: "2",
Errors: "2",
Failures: "2",
Timestamp: "2021-00-00T00:00:00Z",
Time: "0.15",
Hostname: "0xb",
Package: "testPackage",
Name: "ZCL_testPackage",
Testcase: []struct {
Asserts string "xml:\"asserts,attr\""
Time string "xml:\"time,attr\""
Name string "xml:\"name,attr\""
Classname string "xml:\"classname,attr\""
Error []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
} "xml:\"error\""
Failure []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
} "xml:\"failure\""
Skipped []struct {
Text string "xml:\",chardata\""
Message string "xml:\"message,attr\""
} "xml:\"skipped\""
}{{
Asserts: "4",
Time: "0.15",
Name: "my_test",
Classname: "ZCL_my_test",
Error: []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
}{{
Text: "testError",
Type: "Assert Error",
Message: "testMessage",
}, {
Text: "testError2",
Type: "Assert Error2",
Message: "testMessage2",
}},
Failure: []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
}{{
Text: "testFailure",
Type: "Assert Failure",
Message: "testMessage",
}, {
Text: "testFailure2",
Type: "Assert Failure2",
Message: "testMessage2",
}},
Skipped: []struct {
Text string "xml:\",chardata\""
Message string "xml:\"message,attr\""
}{{
Text: "testSkipped",
Message: "testSkipped",
}, {
Text: "testSkipped2",
Message: "testSkipped2",
}},
}, {
Asserts: "4",
Time: "0.15",
Name: "my_test2",
Classname: "ZCL_my_test2",
Error: []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
}{{
Text: "testError3",
Type: "Assert Error3",
Message: "testMessage3",
}, {
Text: "testError4",
Type: "Assert Error4",
Message: "testMessage4",
}},
Failure: []struct {
Text string "xml:\",chardata\""
Type string "xml:\"type,attr\""
Message string "xml:\"message,attr\""
}{{
Text: "testFailure5",
Type: "Assert Failure5",
Message: "testMessage5",
}, {
Text: "testFailure6",
Type: "Assert Failure6",
Message: "testMessage6",
}},
Skipped: []struct {
Text string "xml:\",chardata\""
Message string "xml:\"message,attr\""
}{{
Text: "testSkipped7",
Message: "testSkipped7",
}, {
Text: "testSkipped8",
Message: "testSkipped8",
}},
}},
},
}
resultString := generateHTMLDocumentAUnit(&result)
fmt.Println(resultString)
assert.Equal(t, expectedString, resultString)
})
}