Skip to content

Commit d3db0bc

Browse files
committed
refactor: stop overwriting pytest data
1 parent 0408b0d commit d3db0bc

File tree

8 files changed

+57
-57
lines changed

8 files changed

+57
-57
lines changed

src/pytest_html/nextgen.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,15 @@ def _write_report(self, rendered_report):
206206
def pytest_sessionstart(self, session):
207207
config = session.config
208208
if hasattr(config, "_metadata") and config._metadata:
209-
self._report.data["environment"] = self._generate_environment()
209+
self._report.set_data("environment", self._generate_environment())
210210

211211
session.config.hook.pytest_html_report_title(report=self._report)
212212

213213
header_cells = self.Cells()
214214
session.config.hook.pytest_html_results_table_header(cells=header_cells)
215215
self._report.set_data("resultsTableHeader", header_cells.html)
216216

217-
self._report.data["runningState"] = "Started"
217+
self._report.set_data("runningState", "Started")
218218
self._generate_report()
219219

220220
@pytest.hookimpl(trylast=True)
@@ -224,7 +224,7 @@ def pytest_sessionfinish(self, session):
224224
summary=self._report.data["additionalSummary"]["summary"],
225225
postfix=self._report.data["additionalSummary"]["postfix"],
226226
)
227-
self._report.data["runningState"] = "Finished"
227+
self._report.set_data("runningState", "Finished")
228228
self._generate_report()
229229

230230
@pytest.hookimpl(trylast=True)
@@ -235,7 +235,7 @@ def pytest_terminal_summary(self, terminalreporter):
235235

236236
@pytest.hookimpl(trylast=True)
237237
def pytest_collection_finish(self, session):
238-
self._report.data["collectedItems"] = len(session.items)
238+
self._report.set_data("collectedItems", len(session.items))
239239

240240
@pytest.hookimpl(trylast=True)
241241
def pytest_runtest_logreport(self, report):
@@ -246,23 +246,23 @@ def pytest_runtest_logreport(self, report):
246246
test_id = report.nodeid
247247
if report.when != "call":
248248
test_id += f"::{report.when}"
249-
data["nodeid"] = test_id
249+
data["testId"] = test_id
250250

251251
# Order here matters!
252252
log = report.longreprtext or report.capstdout or "No log output captured."
253-
data["longreprtext"] = _handle_ansi(log)
253+
data["log"] = _handle_ansi(log)
254254

255-
data["outcome"] = _process_outcome(report)
255+
data["result"] = _process_outcome(report)
256256

257257
row_cells = self.Cells()
258258
self._config.hook.pytest_html_results_table_row(report=report, cells=row_cells)
259-
data.update({"resultsTableRow": row_cells.html})
259+
data["resultsTableRow"] = row_cells.html
260260

261261
table_html = []
262262
self._config.hook.pytest_html_results_table_html(report=report, data=table_html)
263-
data.update({"tableHtml": table_html})
263+
data["tableHtml"] = table_html
264264

265-
data.update({"extras": self._process_extras(report, test_id)})
265+
data["extras"] = self._process_extras(report, test_id)
266266
self._report.data["tests"].append(data)
267267
self._generate_report()
268268

src/pytest_html/resources/index.jinja2

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@
6060
<template id="template_results-table__head">
6161
<thead id="results-table-head">
6262
<tr>
63-
<th class="sortable" data-column-type="outcome">Result</th>
64-
<th class="sortable" data-column-type="nodeid">Test</th>
63+
<th class="sortable" data-column-type="result">Result</th>
64+
<th class="sortable" data-column-type="testid">Test</th>
6565
<th class="sortable" data-column-type="duration">Duration</th>
6666
<th>Links</th>
6767
</tr>

src/pytest_html/scripts/datamanager.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class DataManager {
66
const dataBlob = { ...data, tests: data.tests.map((test, index) => ({
77
...test,
88
id: `test_${index}`,
9-
collapsed: collapsedCategories.includes(test.outcome.toLowerCase()),
9+
collapsed: collapsedCategories.includes(test.result.toLowerCase()),
1010
})) }
1111
this.data = { ...dataBlob }
1212
this.renderData = { ...dataBlob }

src/pytest_html/scripts/dom.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const dom = {
5252
const header = listHeader.content.cloneNode(true)
5353
const sortAttr = storageModule.getSort()
5454
const sortAsc = JSON.parse(storageModule.getSortDirection())
55-
const sortables = ['outcome', 'nodeid', 'duration']
55+
const sortables = ['result', 'testId', 'duration']
5656

5757
sortables.forEach((sortCol) => {
5858
if (sortCol === sortAttr) {
@@ -67,23 +67,23 @@ const dom = {
6767
},
6868
getListHeaderEmpty: () => listHeaderEmpty.content.cloneNode(true),
6969
getColGroup: () => templateCollGroup.content.cloneNode(true),
70-
getResultTBody: ({ nodeid, id, longreprtext, duration, extras, resultsTableRow, tableHtml, outcome, collapsed }) => {
71-
const outcomeLower = outcome.toLowerCase()
70+
getResultTBody: ({ testId, id, log, duration, extras, resultsTableRow, tableHtml, result, collapsed }) => {
71+
const resultLower = result.toLowerCase()
7272
let formattedDuration = formatDuration(duration)
7373
formattedDuration = formatDuration < 1 ? formattedDuration.ms : formattedDuration.formatted
7474
const resultBody = templateResult.content.cloneNode(true)
75-
resultBody.querySelector('tbody').classList.add(outcomeLower)
76-
resultBody.querySelector('.col-result').innerText = outcome
75+
resultBody.querySelector('tbody').classList.add(resultLower)
76+
resultBody.querySelector('.col-result').innerText = result
7777
resultBody.querySelector('.col-result').classList.add(`${collapsed ? 'expander' : 'collapser'}`)
7878
resultBody.querySelector('.col-result').dataset.id = id
79-
resultBody.querySelector('.col-name').innerText = nodeid
79+
resultBody.querySelector('.col-name').innerText = testId
8080

8181
resultBody.querySelector('.col-duration').innerText = duration < 1 ? formatDuration(duration).ms : formatDuration(duration).formatted
8282

8383

84-
if (longreprtext) {
85-
// resultBody.querySelector('.log').innerText = longreprtext
86-
resultBody.querySelector('.log').innerHTML = longreprtext
84+
if (log) {
85+
// resultBody.querySelector('.log').innerText = log
86+
resultBody.querySelector('.log').innerHTML = log
8787
}
8888
// if (collapsed || !longreprtext) {
8989
if (collapsed) {

src/pytest_html/scripts/filter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const { manager } = require('./datamanager.js')
22
const storageModule = require('./storage.js')
33

44
const getFilteredSubSet = (filter) =>
5-
manager.allData.tests.filter(({ outcome }) => filter.includes(outcome.toLowerCase()))
5+
manager.allData.tests.filter(({ result }) => filter.includes(result.toLowerCase()))
66

77
const doInitFilter = () => {
88
const currentFilter = storageModule.getVisible()

src/pytest_html/scripts/main.js

+18-18
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const renderStatic = () => {
2929
}
3030

3131
const renderContent = (tests) => {
32-
const renderSet = tests.filter(({ when, outcome }) => when === 'call' || outcome === 'Error' )
32+
const renderSet = tests.filter(({ when, result }) => when === 'call' || result === 'Error' )
3333
const rows = renderSet.map(dom.getResultTBody)
3434
const table = document.querySelector('#results-table')
3535
removeChildren(table)
@@ -62,30 +62,30 @@ const renderContent = (tests) => {
6262
}
6363

6464
const renderDerived = (tests, collectedItems, isFinished) => {
65-
const renderSet = tests.filter(({ when, outcome }) => when === 'call' || outcome === 'Error')
66-
67-
const possibleOutcomes = [
68-
{ outcome: 'passed', label: 'Passed' },
69-
{ outcome: 'skipped', label: 'Skipped' },
70-
{ outcome: 'failed', label: 'Failed' },
71-
{ outcome: 'error', label: 'Errors' },
72-
{ outcome: 'xfailed', label: 'Unexpected failures' },
73-
{ outcome: 'xpassed', label: 'Unexpected passes' },
74-
{ outcome: 'rerun', label: 'Reruns' },
65+
const renderSet = tests.filter(({ when, result }) => when === 'call' || result === 'Error')
66+
67+
const possibleResults = [
68+
{ result: 'passed', label: 'Passed' },
69+
{ result: 'skipped', label: 'Skipped' },
70+
{ result: 'failed', label: 'Failed' },
71+
{ result: 'error', label: 'Errors' },
72+
{ result: 'xfailed', label: 'Unexpected failures' },
73+
{ result: 'xpassed', label: 'Unexpected passes' },
74+
{ result: 'rerun', label: 'Reruns' },
7575
]
7676

7777
const currentFilter = getVisible()
78-
possibleOutcomes.forEach(({ outcome, label }) => {
79-
const count = renderSet.filter((test) => test.outcome.toLowerCase() === outcome).length
80-
const input = document.querySelector(`input[data-test-result="${outcome}"]`)
81-
document.querySelector(`.${outcome}`).innerText = `${count} ${label}`
78+
possibleResults.forEach(({ result, label }) => {
79+
const count = renderSet.filter((test) => test.result.toLowerCase() === result).length
80+
const input = document.querySelector(`input[data-test-result="${result}"]`)
81+
document.querySelector(`.${result}`).innerText = `${count} ${label}`
8282

8383
input.disabled = !count
84-
input.checked = currentFilter.includes(outcome)
84+
input.checked = currentFilter.includes(result)
8585
})
8686

87-
const numberOfTests = renderSet.filter(({ outcome }) =>
88-
['Passed', 'Failed', 'XPassed', 'XFailed'].includes(outcome)).length
87+
const numberOfTests = renderSet.filter(({ result }) =>
88+
['Passed', 'Failed', 'XPassed', 'XFailed'].includes(result)).length
8989

9090
if (isFinished) {
9191
const accTime = tests.reduce((prev, { duration }) => prev + duration, 0)

src/pytest_html/scripts/storage.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const setFilter = (currentFilter) => {
4141

4242
const getSort = () => {
4343
const url = new URL(window.location.href)
44-
return new URLSearchParams(url.search).get('sort') || 'outcome'
44+
return new URLSearchParams(url.search).get('sort') || 'result'
4545
}
4646
const setSort = (type) => {
4747
const url = new URL(window.location.href)

testing/unittest.js

+15-15
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,27 @@ const setTestData = () => {
1313
[
1414
{
1515
'id': 'passed_1',
16-
'outcome': 'passed',
16+
'result': 'passed',
1717
},
1818
{
1919
'id': 'failed_2',
20-
'outcome': 'failed',
20+
'result': 'failed',
2121
},
2222
{
2323
'id': 'passed_3',
24-
'outcome': 'passed',
24+
'result': 'passed',
2525
},
2626
{
2727
'id': 'passed_4',
28-
'outcome': 'passed',
28+
'result': 'passed',
2929
},
3030
{
3131
'id': 'passed_5',
32-
'outcome': 'passed',
32+
'result': 'passed',
3333
},
3434
{
3535
'id': 'passed_6',
36-
'outcome': 'passed',
36+
'result': 'passed',
3737
},
3838
],
3939
}
@@ -55,15 +55,15 @@ describe('Filter tests', () => {
5555

5656
doInitFilter()
5757
expect(managerSpy.callCount).to.eql(1)
58-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql([])
58+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql([])
5959
})
6060
it('exclude passed', () => {
6161
getFilterMock = sinon.stub(storageModule, 'getVisible').returns(['failed'])
6262
managerSpy = sinon.spy(dataModule.manager, 'setRender')
6363

6464
doInitFilter()
6565
expect(managerSpy.callCount).to.eql(1)
66-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql(['failed'])
66+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql(['failed'])
6767
})
6868
})
6969
describe('doFilter', () => {
@@ -76,7 +76,7 @@ describe('Filter tests', () => {
7676

7777
doFilter('passed', true)
7878
expect(managerSpy.callCount).to.eql(1)
79-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql([
79+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql([
8080
'passed', 'passed', 'passed', 'passed', 'passed',
8181
])
8282
})
@@ -101,18 +101,18 @@ describe('Sort tests', () => {
101101

102102
doInitSort()
103103
expect(managerSpy.callCount).to.eql(1)
104-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql([
104+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql([
105105
'passed', 'failed', 'passed', 'passed', 'passed', 'passed',
106106
])
107107
})
108108
it('has stored sort preference', () => {
109-
sortMock = sinon.stub(storageModule, 'getSort').returns('outcome')
109+
sortMock = sinon.stub(storageModule, 'getSort').returns('result')
110110
sortDirectionMock = sinon.stub(storageModule, 'getSortDirection').returns(false)
111111
managerSpy = sinon.spy(dataModule.manager, 'setRender')
112112

113113
doInitSort()
114114
expect(managerSpy.callCount).to.eql(1)
115-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql([
115+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql([
116116
'failed', 'passed', 'passed', 'passed', 'passed', 'passed',
117117
])
118118
})
@@ -127,16 +127,16 @@ describe('Sort tests', () => {
127127
afterEach(() => [
128128
getSortMock, setSortMock, getSortDirectionMock, setSortDirection, managerSpy,
129129
].forEach((fn) => fn.restore()))
130-
it('sort on outcome', () => {
130+
it('sort on result', () => {
131131
getSortMock = sinon.stub(storageModule, 'getSort').returns(null)
132132
setSortMock = sinon.stub(storageModule, 'setSort')
133133
getSortDirectionMock = sinon.stub(storageModule, 'getSortDirection').returns(null)
134134
setSortDirection = sinon.stub(storageModule, 'setSortDirection')
135135
managerSpy = sinon.spy(dataModule.manager, 'setRender')
136136

137-
doSort('outcome')
137+
doSort('result')
138138
expect(managerSpy.callCount).to.eql(1)
139-
expect(dataModule.manager.testSubset.map(({ outcome }) => outcome)).to.eql([
139+
expect(dataModule.manager.testSubset.map(({ result }) => result)).to.eql([
140140
'passed', 'passed', 'passed', 'passed', 'passed', 'failed',
141141
])
142142
})

0 commit comments

Comments
 (0)