mirror of
https://github.com/jstemmer/go-junit-report.git
synced 2025-04-05 13:08:07 -05:00
182 lines
4.1 KiB
Go
182 lines
4.1 KiB
Go
package junit
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/jstemmer/go-junit-report/v2/gtr"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestCreateFromReport(t *testing.T) {
|
|
report := gtr.Report{
|
|
Packages: []gtr.Package{
|
|
{
|
|
Name: "package/name",
|
|
Timestamp: time.Date(2022, 6, 26, 0, 0, 0, 0, time.UTC),
|
|
Duration: 1 * time.Second,
|
|
Coverage: 0.9,
|
|
Output: []string{"output"},
|
|
Properties: map[string]string{"go.version": "go1.18"},
|
|
Tests: []gtr.Test{
|
|
{
|
|
Name: "TestPass",
|
|
Result: gtr.Pass,
|
|
Output: []string{"ok"},
|
|
},
|
|
{
|
|
Name: "TestFail",
|
|
Result: gtr.Fail,
|
|
Output: []string{"fail"},
|
|
},
|
|
{
|
|
Name: "TestSkip",
|
|
Result: gtr.Skip,
|
|
},
|
|
{
|
|
Name: "TestIncomplete",
|
|
Result: gtr.Unknown,
|
|
},
|
|
},
|
|
BuildError: gtr.Error{Name: "Build error"},
|
|
RunError: gtr.Error{Name: "Run error"},
|
|
},
|
|
},
|
|
}
|
|
|
|
want := Testsuites{
|
|
Tests: 6,
|
|
Errors: 3,
|
|
Failures: 1,
|
|
Skipped: 1,
|
|
Suites: []Testsuite{
|
|
{
|
|
Name: "package/name",
|
|
Tests: 6,
|
|
Errors: 3,
|
|
ID: 0,
|
|
Failures: 1,
|
|
Skipped: 1,
|
|
Time: "1.000",
|
|
Timestamp: "2022-06-26T00:00:00Z",
|
|
Properties: &[]Property{
|
|
{Name: "go.version", Value: "go1.18"},
|
|
{Name: "coverage.statements.pct", Value: "0.90"},
|
|
},
|
|
Testcases: []Testcase{
|
|
{
|
|
Name: "TestPass",
|
|
Classname: "package/name",
|
|
Time: "0.000",
|
|
SystemOut: &Output{Data: "ok"},
|
|
},
|
|
{
|
|
Name: "TestFail",
|
|
Classname: "package/name",
|
|
Time: "0.000",
|
|
Failure: &Result{Message: "Failed", Data: "fail"},
|
|
},
|
|
{
|
|
Name: "TestSkip",
|
|
Classname: "package/name",
|
|
Time: "0.000",
|
|
Skipped: &Result{Message: "Skipped"},
|
|
},
|
|
{
|
|
Name: "TestIncomplete",
|
|
Classname: "package/name",
|
|
Time: "0.000",
|
|
Error: &Result{Message: "No test result found"},
|
|
},
|
|
{
|
|
Classname: "Build error",
|
|
Time: "0.000",
|
|
Error: &Result{Message: "Build error"},
|
|
},
|
|
{
|
|
Name: "Failure",
|
|
Classname: "Run error",
|
|
Time: "0.000",
|
|
Error: &Result{Message: "Runtime error"},
|
|
},
|
|
},
|
|
SystemOut: &Output{Data: "output"},
|
|
},
|
|
},
|
|
}
|
|
|
|
got := CreateFromReport(report, "")
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("CreateFromReport incorrect, diff (-want, +got):\n%s\n", diff)
|
|
}
|
|
}
|
|
|
|
func TestMarshalUnmarshal(t *testing.T) {
|
|
want := Testsuites{
|
|
Name: "name",
|
|
Time: "12.345",
|
|
Tests: 1,
|
|
Errors: 1,
|
|
Failures: 1,
|
|
Disabled: 1,
|
|
Suites: []Testsuite{
|
|
{
|
|
Name: "suite1",
|
|
Tests: 1,
|
|
Errors: 1,
|
|
Failures: 1,
|
|
Hostname: "localhost",
|
|
ID: 0,
|
|
Package: "package",
|
|
Skipped: 1,
|
|
Time: "12.345",
|
|
Timestamp: "2012-03-09T14:38:06+01:00",
|
|
Properties: properties("key", "value"),
|
|
Testcases: []Testcase{
|
|
{
|
|
Name: "test1",
|
|
Classname: "class",
|
|
Time: "12.345",
|
|
Status: "status",
|
|
Skipped: &Result{Message: "skipped", Type: "type", Data: "data"},
|
|
Error: &Result{Message: "error", Type: "type", Data: "data"},
|
|
Failure: &Result{Message: "failure", Type: "type", Data: "data"},
|
|
SystemOut: &Output{"system-out"},
|
|
SystemErr: &Output{"system-err"},
|
|
},
|
|
},
|
|
SystemOut: &Output{"system-out"},
|
|
SystemErr: &Output{"system-err"},
|
|
},
|
|
},
|
|
}
|
|
|
|
data, err := xml.MarshalIndent(want, "", "\t")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var got Testsuites
|
|
if err := xml.Unmarshal(data, &got); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
want.XMLName.Local = "testsuites"
|
|
if diff := cmp.Diff(want, got); diff != "" {
|
|
t.Errorf("Unmarshal result incorrect, diff (-want +got):\n%s\n", diff)
|
|
}
|
|
}
|
|
|
|
func properties(keyvals ...string) *[]Property {
|
|
if len(keyvals)%2 != 0 {
|
|
panic("invalid keyvals specified")
|
|
}
|
|
var props []Property
|
|
for i := 0; i < len(keyvals); i += 2 {
|
|
props = append(props, Property{keyvals[i], keyvals[i+1]})
|
|
}
|
|
return &props
|
|
}
|