-
Notifications
You must be signed in to change notification settings - Fork 67
/
testsuite.go
133 lines (107 loc) 路 3.31 KB
/
testsuite.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package formatters
import (
"encoding/json"
"fmt"
"strings"
"github.com/kubeshop/tracetest/cli/openapi"
"github.com/pterm/pterm"
)
type testSuiteRun struct {
baseURLFn func() string
colorsEnabled bool
testRunFormatter testRun
}
func TestSuiteRun(baseURLFn func() string, colorsEnabled bool) testSuiteRun {
return testSuiteRun{
baseURLFn: baseURLFn,
colorsEnabled: colorsEnabled,
testRunFormatter: TestRun(baseURLFn, colorsEnabled, WithPadding(1)),
}
}
type TestSuiteRunOutput struct {
HasResults bool `json:"-"`
TestSuite openapi.TestSuite `json:"testSuite"`
Run openapi.TestSuiteRun `json:"testSuiteRun"`
RunWebURL string `json:"testSuiteRunWebUrl"`
}
func (f testSuiteRun) Format(output TestSuiteRunOutput, format Output) string {
output.RunWebURL = f.getRunLink(output.TestSuite.GetId(), output.Run.GetId())
switch format {
case JSON:
return f.json(output)
case Pretty, "":
return f.pretty(output)
}
return ""
}
func (f testSuiteRun) json(output TestSuiteRunOutput) string {
type stepResult struct {
Name string `json:"name"`
Results openapi.AssertionResults `json:"results"`
}
type testSuiteResult struct {
RunWebURL string `json:"testRunWebUrl"`
Steps []stepResult `json:"steps"`
}
stepsResults := make([]stepResult, 0, len(output.Run.Steps))
for i, step := range output.Run.Steps {
test := output.TestSuite.FullSteps[i]
stepsResults = append(stepsResults, stepResult{
Name: *test.Name,
Results: *step.Result,
})
}
result := testSuiteResult{
RunWebURL: output.RunWebURL,
Steps: stepsResults,
}
bytes, err := json.MarshalIndent(result, "", " ")
if err != nil {
panic(fmt.Errorf("could not marshal output json: %w", err))
}
return string(bytes) + "\n"
}
func (f testSuiteRun) pretty(output TestSuiteRunOutput) string {
message := fmt.Sprintf("%s %s (%s)\n", PASSED_TEST_ICON, output.TestSuite.GetName(), output.RunWebURL)
if !output.HasResults {
return f.getColoredText(true, message)
}
allStepsPassed := f.allTestSuiteStepsPassed(output)
if !allStepsPassed {
message = fmt.Sprintf("%s %s (%s)\n", FAILED_TEST_ICON, output.TestSuite.GetName(), output.RunWebURL)
}
// the test suite name + all steps
formattedMessages := make([]string, 0, len(output.Run.Steps)+1)
formattedMessages = append(formattedMessages, f.getColoredText(allStepsPassed, message))
for i, testRun := range output.Run.Steps {
test := output.TestSuite.FullSteps[i]
message := f.testRunFormatter.pretty(TestRunOutput{
HasResults: true,
Test: test,
Run: testRun,
RunWebURL: f.testRunFormatter.GetRunLink(*test.Id, *testRun.Id),
})
formattedMessages = append(formattedMessages, message)
}
return strings.Join(formattedMessages, "")
}
func (f testSuiteRun) allTestSuiteStepsPassed(output TestSuiteRunOutput) bool {
for _, step := range output.Run.Steps {
if !step.Result.GetAllPassed() {
return false
}
}
return true
}
func (f testSuiteRun) getColoredText(passed bool, text string) string {
if !f.colorsEnabled {
return text
}
if passed {
return pterm.FgGreen.Sprintf(text)
}
return pterm.FgRed.Sprintf(text)
}
func (f testSuiteRun) getRunLink(tsID string, runID int32) string {
return fmt.Sprintf("%s/testsuite/%s/run/%d", f.baseURLFn(), tsID, runID)
}