Skip to content

Commit 6400ef4

Browse files
authored
Query params (pytest-dev#25)
* Add query params
1 parent fd62881 commit 6400ef4

File tree

5 files changed

+77
-27
lines changed

5 files changed

+77
-27
lines changed

src/pytest_html/scripts/datamanager.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
const { getCollapsedCategory } = require('./storage.js')
2+
13
class DataManager {
24
setManager(data) {
5+
const collapsedCategories = getCollapsedCategory()
36
const dataBlob = { ...data, tests: data.tests.map((test, index) => ({
47
...test,
58
id: `test_${index}`,
6-
collapsed: false,
9+
collapsed: collapsedCategories.includes(test.outcome.toLowerCase()),
710
})) }
811
this.data = { ...dataBlob }
912
this.renderData = { ...dataBlob }
1013
}
14+
1115
get allData() {
1216
return { ...this.data }
1317
}

src/pytest_html/scripts/filter.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,23 @@ 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(({ outcome }) => filter.includes(outcome.toLowerCase()))
66

77
const doInitFilter = () => {
8-
const currentFilter = storageModule.getFilter()
8+
const currentFilter = storageModule.getVisible()
99
const filteredSubset = getFilteredSubSet(currentFilter)
1010
manager.setRender(filteredSubset)
1111
}
1212

13-
const doFilter = (type, apply) => {
14-
const currentFilter = storageModule.getFilter()
15-
if (!apply) {
16-
currentFilter.push(type)
13+
const doFilter = (type, show) => {
14+
if (show) {
15+
storageModule.showCategory(type)
1716
} else {
18-
const index = currentFilter.indexOf(type)
19-
if (index > -1) {
20-
currentFilter.splice(index, 1)
21-
}
17+
storageModule.hideCategory(type)
2218
}
2319

24-
storageModule.setFilter(currentFilter)
20+
const currentFilter = storageModule.getVisible()
21+
2522
if (currentFilter.length) {
2623
const filteredSubset = getFilteredSubSet(currentFilter)
2724
manager.setRender(filteredSubset)

src/pytest_html/scripts/main.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const { dom, findAll } = require('./dom.js')
33
const { manager } = require('./datamanager.js')
44
const { doSort } = require('./sort.js')
55
const { doFilter } = require('./filter.js')
6-
const { getFilter } = require('./storage.js')
6+
const { getVisible } = require('./storage.js')
77

88
const removeChildren = (node) => {
99
while (node.firstChild) {
@@ -74,14 +74,14 @@ const renderDerived = (tests, collectedItems, isFinished) => {
7474
{ outcome: 'rerun', label: 'Reruns' },
7575
]
7676

77-
const currentFilter = getFilter()
77+
const currentFilter = getVisible()
7878
possibleOutcomes.forEach(({ outcome, label }) => {
7979
const count = renderSet.filter((test) => test.outcome.toLowerCase() === outcome).length
8080
const input = document.querySelector(`input[data-test-result="${outcome}"]`)
8181
document.querySelector(`.${outcome}`).innerText = `${count} ${label}`
8282

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

8787
const numberOfTests = renderSet.filter(({ outcome }) =>

src/pytest_html/scripts/storage.js

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,71 @@
1-
const getFilter = () => [...new Set(JSON.parse(sessionStorage.getItem('filter')))]
1+
const possibleFiltes = ['passed', 'skipped', 'failed', 'error', 'xfailed', 'xpassed', 'rerun']
2+
3+
const getVisible = () => {
4+
const url = new URL(window.location.href)
5+
const settings = new URLSearchParams(url.search).get('visible') || ''
6+
const toret = settings ?
7+
[...new Set(settings.split(',').filter((filter) => possibleFiltes.includes(filter)))] : possibleFiltes
8+
9+
return toret
10+
}
11+
const hideCategory = (categoryToHide) => {
12+
const url = new URL(window.location.href)
13+
const visibleParams = new URLSearchParams(url.search).get('visible')
14+
const currentVisible = visibleParams ? visibleParams.split(',') : [...possibleFiltes]
15+
const settings = [...new Set(currentVisible)].filter((f) => f !== categoryToHide).join(',')
16+
17+
url.searchParams.set('visible', settings)
18+
history.pushState({}, null, unescape(url.href))
19+
}
20+
21+
const showCategory = (categoryToShow) => {
22+
const url = new URL(window.location.href)
23+
const currentVisible = new URLSearchParams(url.search).get('visible')?.split(',') || [...possibleFiltes]
24+
const settings = [...new Set([categoryToShow, ...currentVisible])]
25+
const noFilter = possibleFiltes.length === settings.length || !settings.length
26+
27+
noFilter ? url.searchParams.delete('visible') : url.searchParams.set('visible', settings.join(','))
28+
history.pushState({}, null, unescape(url.href))
29+
}
230
const setFilter = (currentFilter) => {
3-
sessionStorage.setItem('filter', JSON.stringify(currentFilter))
31+
if (!possibleFiltes.includes(currentFilter)) {
32+
return
33+
}
34+
const url = new URL(window.location.href)
35+
const settings = [currentFilter, ...new Set(new URLSearchParams(url.search).get('filter').split(','))]
36+
37+
url.searchParams.set('filter', settings)
38+
history.pushState({}, null, unescape(url.href))
439
}
540

6-
const getSort = () => sessionStorage.getItem('sort')
7-
const setSort = (type) => sessionStorage.setItem('sort', type)
41+
const getSort = () => {
42+
const url = new URL(window.location.href)
43+
return new URLSearchParams(url.search).get('sort') || 'outcome'
44+
}
45+
const setSort = (type) => {
46+
const url = new URL(window.location.href)
47+
url.searchParams.set('sort', type)
48+
history.pushState({}, null, unescape(url.href))
49+
}
50+
51+
const getCollapsedCategory = () => {
52+
const url = new URL(window.location.href)
53+
const collapsedItems = new URLSearchParams(url.search).get('collapsed')
54+
return collapsedItems?.split(',') || []
55+
}
856

957
const getSortDirection = () => JSON.parse(sessionStorage.getItem('sortAsc'))
1058

11-
const setSortDirection = (ascending) => {
12-
sessionStorage.setItem('sortAsc', ascending)
13-
}
59+
const setSortDirection = (ascending) => sessionStorage.setItem('sortAsc', ascending)
1460

1561
module.exports = {
16-
getFilter,
62+
getVisible,
1763
setFilter,
64+
hideCategory,
65+
showCategory,
1866
getSort,
1967
getSortDirection,
2068
setSort,
2169
setSortDirection,
70+
getCollapsedCategory,
2271
}

testing/unittest.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ describe('Filter tests', () => {
4545
after(() => dataModule.manager.setManager({ tests: [] }))
4646
describe('doInitFilter', () => {
4747
it('has no stored filters', () => {
48-
getFilterMock = sinon.stub(storageModule, 'getFilter').returns([])
48+
getFilterMock = sinon.stub(storageModule, 'getVisible').returns([])
4949
managerSpy = sinon.spy(dataModule.manager, 'setRender')
5050

5151
doInitFilter()
@@ -55,7 +55,7 @@ describe('Filter tests', () => {
5555
])
5656
})
5757
it('exclude passed', () => {
58-
getFilterMock = sinon.stub(storageModule, 'getFilter').returns(['passed'])
58+
getFilterMock = sinon.stub(storageModule, 'getVisible').returns(['passed'])
5959
managerSpy = sinon.spy(dataModule.manager, 'setRender')
6060

6161
doInitFilter()
@@ -67,7 +67,7 @@ describe('Filter tests', () => {
6767
let setFilterMock
6868
afterEach(() => setFilterMock.restore())
6969
it('removes a filter', () => {
70-
getFilterMock = sinon.stub(storageModule, 'getFilter').returns(['passed'])
70+
getFilterMock = sinon.stub(storageModule, 'getVisible').returns(['passed'])
7171
setFilterMock = sinon.stub(storageModule, 'setFilter')
7272
managerSpy = sinon.spy(dataModule.manager, 'setRender')
7373

@@ -78,7 +78,7 @@ describe('Filter tests', () => {
7878
])
7979
})
8080
it('applies a filter', () => {
81-
getFilterMock = sinon.stub(storageModule, 'getFilter').returns([])
81+
getFilterMock = sinon.stub(storageModule, 'getVisible').returns([])
8282
setFilterMock = sinon.stub(storageModule, 'setFilter')
8383
managerSpy = sinon.spy(dataModule.manager, 'setRender')
8484

0 commit comments

Comments
 (0)