Skip to content

Commit 92b70a8

Browse files
authored
Merge pull request #40 from gstokkink/include-failure-or-error-message-on-dashboard
Include failure or error message on dashboard
2 parents 50e3bd4 + 01d9c8f commit 92b70a8

File tree

4 files changed

+69
-7
lines changed

4 files changed

+69
-7
lines changed

src/dashboard.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,20 @@ export function dashboardResults(result: TestResult, show: number): string {
5555
table += escapeHTML(testcase.description)
5656
}
5757

58-
if (testcase.details) {
58+
if (testcase.message || testcase.details) {
5959
table += "<br/>\n"
60-
table += "<pre><code>"
61-
table += escapeHTML(testcase.details)
62-
table += "</code></pre>"
60+
61+
if (testcase.message) {
62+
table += "<pre><code>"
63+
table += escapeHTML(testcase.message)
64+
table += "</code></pre>"
65+
}
66+
67+
if (testcase.details) {
68+
table += "<pre><code>"
69+
table += escapeHTML(testcase.details)
70+
table += "</code></pre>"
71+
}
6372
}
6473

6574
table += "</td></tr>\n"

src/test_parser.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface TestCase {
3434
status: TestStatus
3535
name?: string
3636
description?: string
37+
message?: string
3738
details?: string
3839
duration?: string
3940
}
@@ -235,15 +236,21 @@ async function parseJunitXml(xml: any): Promise<TestResult> {
235236
const name = testcase.$.name
236237
const duration = testcase.$.time
237238

239+
let failure_or_error
240+
let message: string | undefined = undefined
238241
let details: string | undefined = undefined
239242

240243
if (testcase.skipped) {
241244
status = TestStatus.Skip
242245

243246
counts.skipped++
244-
} else if (testcase.failure || testcase.error) {
247+
} else if (failure_or_error = testcase.failure || testcase.error) {
245248
status = TestStatus.Fail
246-
details = (testcase.failure || testcase.error)[0]._
249+
250+
const element = failure_or_error[0]
251+
252+
message = element.$.message
253+
details = element._
247254

248255
counts.failed++
249256
} else {
@@ -254,6 +261,7 @@ async function parseJunitXml(xml: any): Promise<TestResult> {
254261
status: status,
255262
name: name,
256263
description: classname,
264+
message: message,
257265
details: details,
258266
duration: duration
259267
})

test/dashboard.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,27 @@ describe("dashboard", async () => {
5454
const actual = dashboardResults(result, TestStatus.Fail)
5555
expect(actual).contains("&lt;no name&gt;")
5656
})
57+
58+
it("includes details and message when present, using proper escaping", async () => {
59+
const result: TestResult = {
60+
counts: { passed: 0, failed: 1, skipped: 0 },
61+
suites: [
62+
{
63+
cases: [
64+
{
65+
status: TestStatus.Fail,
66+
name: "Test",
67+
message: "message escaped <properly>",
68+
details: "details escaped <properly>"
69+
}
70+
]
71+
}
72+
]
73+
}
74+
75+
const actual = dashboardResults(result, TestStatus.Fail)
76+
77+
expect(actual).contains("message escaped &lt;properly&gt;")
78+
expect(actual).contains("details escaped &lt;properly&gt;")
79+
})
5780
})

test/junit.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,29 @@ describe("junit", async () => {
8080
expect(result.suites[0].cases[1].name).to.eql("passesTestTwo")
8181
expect(result.suites[0].cases[2].name).to.eql("passesTestThree")
8282
expect(result.suites[0].cases[3].name).to.eql("passesTestFour")
83-
expect(result.suites[0].cases[4].name).to.eql("failsTestFive")
83+
84+
const case_with_message = result.suites[0].cases[4]
85+
86+
expect(case_with_message.name).to.eql("failsTestFive")
87+
expect(case_with_message.message).to.be.a("string")
88+
expect(case_with_message.details).to.be.a("string")
89+
90+
const message = "expected:<42> but was:<43>"
91+
92+
expect(case_with_message.message).to.eql(message)
93+
94+
const details = `junit.framework.AssertionFailedError: expected:<42> but was:<43>
95+
\tat test.failsTestFive(Unknown Source)
96+
\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
97+
\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
98+
\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
99+
\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
100+
\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
101+
\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
102+
`
103+
104+
expect(case_with_message.details).to.eql(details)
105+
84106
expect(result.suites[0].cases[5].name).to.eql("failsTestSix")
85107
expect(result.suites[0].cases[6].name).to.eql("failsTestSeven")
86108
expect(result.suites[0].cases[7].name).to.eql("failsTestEight")

0 commit comments

Comments
 (0)