|
5 | 5 | "errors" |
6 | 6 | "os" |
7 | 7 | "slices" |
| 8 | + "strings" |
8 | 9 | "testing" |
9 | 10 |
|
10 | 11 | "github.com/jstemmer/go-junit-report/v2/junit" |
@@ -73,6 +74,19 @@ func TestMergeReports_SingleReport(t *testing.T) { |
73 | 74 | require.Len(t, testNames, 5) |
74 | 75 | require.NotContains(t, testNames, "TestCallbacksSuite") |
75 | 76 | require.NotContains(t, testNames, "TestCallbacksSuite/TestWorkflowNexusCallbacks_CarriedOver") |
| 77 | + var failureData string |
| 78 | + for _, tc := range suites[0].Testcases { |
| 79 | + if tc.Name == "TestCallbacksSuite/TestWorkflowCallbacks_InvalidArgument" { |
| 80 | + require.NotNil(t, tc.Failure) |
| 81 | + failureData = tc.Failure.Data |
| 82 | + break |
| 83 | + } |
| 84 | + } |
| 85 | + require.NotEmpty(t, failureData) |
| 86 | + require.Contains(t, failureData, "Error Trace:") |
| 87 | + require.Contains(t, failureData, "expected: 1") |
| 88 | + require.NotContains(t, failureData, "=== RUN") |
| 89 | + require.NotContains(t, failureData, "--- FAIL:") |
76 | 90 | } |
77 | 91 |
|
78 | 92 | func TestMergeReports_MultipleReports(t *testing.T) { |
@@ -164,6 +178,56 @@ func TestAppendAlertsSuite(t *testing.T) { |
164 | 178 | requireReportEquals(t, "testdata/junit-alerts-output.xml", out.Name()) |
165 | 179 | } |
166 | 180 |
|
| 181 | +func TestAppendAlertsSuite_TruncatesLargeDetails(t *testing.T) { |
| 182 | + j := &junitReport{} |
| 183 | + details := "panic: large panic\n" + strings.Repeat("x", junitAlertDetailsMaxBytes) + "\ntrailing sentinel" |
| 184 | + j.appendAlertsSuite([]alert{{ |
| 185 | + Kind: alertKindPanic, |
| 186 | + Summary: "large panic", |
| 187 | + Details: details, |
| 188 | + Tests: []string{"TestLargePanic"}, |
| 189 | + }}) |
| 190 | + |
| 191 | + require.Len(t, j.Suites, 1) |
| 192 | + require.Len(t, j.Suites[0].Testcases, 1) |
| 193 | + got := j.Suites[0].Testcases[0].Failure.Data |
| 194 | + require.Contains(t, got, "... (truncated) ...") |
| 195 | + require.Contains(t, got, "panic: large panic") |
| 196 | + require.Contains(t, got, "trailing sentinel") |
| 197 | + require.LessOrEqual(t, len(got), junitAlertDetailsMaxBytes+len("\nDetected in tests:\n\tTestLargePanic")) |
| 198 | +} |
| 199 | + |
| 200 | +func TestMergeReports_PreservesOriginalFailureDataWhenExtractionFindsNothing(t *testing.T) { |
| 201 | + report := &junitReport{ |
| 202 | + Testsuites: junit.Testsuites{ |
| 203 | + Suites: []junit.Testsuite{ |
| 204 | + { |
| 205 | + Name: "suite", |
| 206 | + Testcases: []junit.Testcase{ |
| 207 | + { |
| 208 | + Name: "TestStandalone", |
| 209 | + Failure: &junit.Result{ |
| 210 | + Message: "Failed", |
| 211 | + Data: "plain failure output with no recognizable block", |
| 212 | + }, |
| 213 | + }, |
| 214 | + }, |
| 215 | + Failures: 1, |
| 216 | + Tests: 1, |
| 217 | + }, |
| 218 | + }, |
| 219 | + Failures: 1, |
| 220 | + Tests: 1, |
| 221 | + }, |
| 222 | + } |
| 223 | + |
| 224 | + merged, err := mergeReports([]*junitReport{report}) |
| 225 | + require.NoError(t, err) |
| 226 | + require.Len(t, merged.Suites, 1) |
| 227 | + require.Len(t, merged.Suites[0].Testcases, 1) |
| 228 | + require.Equal(t, "plain failure output with no recognizable block", merged.Suites[0].Testcases[0].Failure.Data) |
| 229 | +} |
| 230 | + |
167 | 231 | func collectTestNames(suites []junit.Testsuite) []string { |
168 | 232 | var testNames []string |
169 | 233 | for _, suite := range suites { |
|
0 commit comments