Skip to content

Commit aa3759b

Browse files
committed
Move outcome handling to backend
1 parent 223bc41 commit aa3759b

File tree

4 files changed

+38
-36
lines changed

4 files changed

+38
-36
lines changed

src/pytest_html/nextgen.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def __init__(self, title, duration_format):
3636
self._data = {
3737
"title": title,
3838
"collectedItems": 0,
39+
"runningState": "not_started",
3940
"durationFormat": duration_format,
4041
"environment": {},
4142
"tests": [],
@@ -165,20 +166,23 @@ def pytest_sessionstart(self, session):
165166
if hasattr(config, "_metadata") and config._metadata:
166167
self._report.data["environment"] = self._generate_environment()
167168

168-
self._generate_report()
169169
session.config.hook.pytest_html_report_title(report=self._report)
170170

171171
header_cells = self.Cells()
172172
session.config.hook.pytest_html_results_table_header(cells=header_cells)
173173
self._report.set_data("resultsTableHeader", header_cells.html)
174174

175+
self._report.data["runningState"] = "Started"
176+
self._generate_report()
177+
175178
@pytest.hookimpl(trylast=True)
176179
def pytest_sessionfinish(self, session):
177180
session.config.hook.pytest_html_results_summary(
178181
prefix=self._report.data["additionalSummary"]["prefix"],
179182
summary=self._report.data["additionalSummary"]["summary"],
180183
postfix=self._report.data["additionalSummary"]["postfix"],
181184
)
185+
self._report.data["runningState"] = "Finished"
182186
self._generate_report()
183187

184188
@pytest.hookimpl(trylast=True)
@@ -193,6 +197,8 @@ def pytest_runtest_logreport(self, report):
193197

194198
test_id = report.nodeid.encode("utf-8").decode("unicode_escape")
195199

200+
data["outcome"] = _process_outcome(report)
201+
196202
row_cells = self.Cells()
197203
self._config.hook.pytest_html_results_table_row(report=report, cells=row_cells)
198204
data.update({"resultsTableRow": row_cells.html})
@@ -287,3 +293,15 @@ def _media_content(self, content, mime_type, *args, **kwargs):
287293

288294
def _generate_report(self, *args, **kwargs):
289295
super()._generate_report(self_contained=True)
296+
297+
298+
def _process_outcome(report):
299+
if report.when in ["setup", "teardown"] and report.outcome == "failed":
300+
return "Error"
301+
if hasattr(report, "wasxfail"):
302+
if report.outcome in ["passed", "failed"]:
303+
return "XPassed"
304+
if report.outcome == "skipped":
305+
return "XFailed"
306+
307+
return report.outcome.capitalize()

src/pytest_html/scripts/datamanager.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class DataManager {
3030
get durationFormat() {
3131
return this.renderData.durationFormat
3232
}
33+
get runningState() {
34+
return this.renderData.runningState
35+
}
3336
}
3437

3538
module.exports = {

src/pytest_html/scripts/dom.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@ const dom = {
6464
return header
6565
},
6666
getListHeaderEmpty: () => listHeaderEmpty.content.cloneNode(true),
67-
getResultTBody: ({ nodeid, longrepr, duration, extras, resultsTableRow, tableHtml }, outcome) => {
67+
getResultTBody: ({ nodeid, longrepr, duration, extras, resultsTableRow, tableHtml, outcome}) => {
6868
const outcomeLower = outcome.toLowerCase()
6969
const resultBody = templateResult.content.cloneNode(true)
7070
resultBody.querySelector('tbody').classList.add(outcomeLower)
7171
resultBody.querySelector('.col-result').innerText = outcome
7272
resultBody.querySelector('.col-name').innerText = nodeid
7373
resultBody.querySelector('.col-duration').innerText = `${formatDuration(duration)}s`
74-
if (['failed', 'error', 'skipped', 'xfailed', 'xpassed'].includes(outcomeLower)) {
74+
if (['failed', 'error', 'xfailed', 'xpassed'].includes(outcomeLower)) {
7575
resultBody.querySelector('.log').innerText = longrepr ?
7676
longrepr.reprtraceback.reprentries[0].data.lines.join('\n') : ''
7777
} else {

src/pytest_html/scripts/main.js

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,6 @@ const removeChildren = (node) => {
1111
}
1212
}
1313

14-
const getOutcome = ({ nodeid, wasxfail }, tests) => {
15-
const relatedOutcome = tests
16-
.filter((test) => test.nodeid === nodeid)
17-
.map(({ outcome }) => outcome)
18-
if (relatedOutcome.includes('failed')) {
19-
return typeof wasxfail === 'undefined' ? 'Failed' : 'XPassed'
20-
} else if (relatedOutcome.includes('error')) {
21-
return 'Error'
22-
} else if (relatedOutcome.includes('skipped')) {
23-
return typeof wasxfail === 'undefined' ? 'Skipped' : 'XFailed'
24-
} else {
25-
return typeof wasxfail === 'undefined' ? 'Passed' : 'XPassed'
26-
}
27-
}
28-
2914
const renderStatic = () => {
3015
const title = manager.title
3116
const environment = manager.environment
@@ -41,10 +26,10 @@ const renderStatic = () => {
4126
}
4227

4328
const renderContent = (tests) => {
44-
const renderSet = tests.filter(({ when }) => when === 'call')
29+
const renderSet = tests.filter(({ when, outcome }) => when === 'call' || outcome === "Error" )
4530

4631
const rows = renderSet.map((test) =>
47-
dom.getResultTBody(test, getOutcome(test, tests))
32+
dom.getResultTBody(test)
4833
)
4934

5035
const table = document.querySelector('#results-table')
@@ -63,8 +48,8 @@ const renderContent = (tests) => {
6348
})
6449
}
6550

66-
const renderDerived = (tests, collectedItems) => {
67-
const renderSet = tests.filter(({ when }) => when === 'call')
51+
const renderDerived = (tests, collectedItems, runningState) => {
52+
const renderSet = tests.filter(({ when, outcome }) => when === 'call' || outcome === 'Error')
6853

6954
const possibleOutcomes = [
7055
{ outcome: 'passed', label: 'Passed' },
@@ -78,31 +63,26 @@ const renderDerived = (tests, collectedItems) => {
7863

7964
const currentFilter = getFilter()
8065
possibleOutcomes.forEach(({ outcome, label }) => {
81-
const count = renderSet.filter((test) => {
82-
const wasXpassed = outcome === 'xpassed' && ['passed', 'failed'].includes(test.outcome)
83-
const wasXfailed = outcome === 'xfailed' && test.outcome === 'skipped'
84-
if (typeof test.wasxfail !== 'undefined') {
85-
return wasXpassed || wasXfailed
86-
} else {
87-
return test.outcome === outcome
88-
}
89-
}).length
66+
const count = renderSet.filter((test) => test.outcome.toLowerCase() === outcome).length
9067
const input = document.querySelector(`input[data-test-result="${outcome}"]`)
9168
document.querySelector(`.${outcome}`).innerText = `${count} ${label}`
9269

9370
input.disabled = !count
9471
input.checked = !currentFilter.includes(outcome)
9572
})
9673

97-
if (collectedItems === renderSet.length) {
74+
const numberOfTests = renderSet.filter(({outcome}) =>
75+
["Passed", "Failed", "XPassed", "XFailed"].includes(outcome)
76+
).length
77+
if (runningState === "Finished") {
9878
const accTime = tests.reduce((prev, { duration }) => prev + duration, 0)
9979
const formattedAccTime = formatDuration(accTime)
100-
const testWord = renderSet.length > 1 ? 'tests' : 'test'
101-
const innerText = `${renderSet.length} ${testWord} ran in ${formattedAccTime} seconds.`
80+
const testWord = numberOfTests > 1 ? 'tests' : 'test'
81+
const innerText = `${numberOfTests} ${testWord} ran in ${formattedAccTime} seconds.`
10282
document.querySelector('.run-count').innerText = innerText
10383
document.querySelector('.summary__reload__button').classList.add('hidden')
10484
} else {
105-
document.querySelector('.run-count').innerText = `${renderSet.length} / ${collectedItems} tests done`
85+
document.querySelector('.run-count').innerText = `${numberOfTests} / ${collectedItems} tests done`
10686
}
10787
}
10888

@@ -131,10 +111,11 @@ const renderPage = () => {
131111
const filteredTests = manager.testSubset
132112
const allTests = manager.allTests
133113
const collectedItems = manager.collectedItems
114+
const runningState = manager.runningState
134115

135116
renderStatic()
136117
renderContent(filteredTests)
137-
renderDerived(allTests, collectedItems)
118+
renderDerived(allTests, collectedItems, runningState)
138119
}
139120

140121
const redraw = () => {

0 commit comments

Comments
 (0)