Skip to content

Commit 1b96730

Browse files
committed
Feature: Update json-data-blob (#704)
1 parent 8bc9a5d commit 1b96730

File tree

4 files changed

+74
-70
lines changed

4 files changed

+74
-70
lines changed

src/pytest_html/resources/index.jinja2

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,27 @@
2626
<td></td>
2727
</tr>
2828
</template>
29+
<template id="template_results-table__head">
30+
<thead id="results-table-head">
31+
<tr>
32+
{%- for th in table_head %}
33+
{{ th|safe }}
34+
{%- endfor %}
35+
</tr>
36+
</thead>
37+
</template>
38+
<template id="template_results-table__body--empty">
39+
<tbody class="results-table-row">
40+
<tr id="not-found-message">
41+
<td colspan="{{ table_head|length }}">No results found. Check the filters.</th>
42+
</tr>
43+
</template>
2944
<template id="template_results-table__tbody">
3045
<tbody class="results-table-row">
3146
<tr class="collapsible">
3247
</tr>
3348
<tr class="extras-row">
34-
<td class="extra" colspan="4">
49+
<td class="extra" colspan="{{ table_head|length }}">
3550
<div class="extraHTML"></div>
3651
<div class="media">
3752
<div class="media-container">
@@ -52,27 +67,15 @@
5267
</tr>
5368
</tbody>
5469
</template>
55-
<template id="template_results-table__head">
56-
<thead id="results-table-head">
57-
<tr>
58-
{%- for th in table_head %}
59-
{{ th|safe }}
60-
{%- endfor %}
61-
</tr>
62-
</thead>
63-
</template>
64-
<template id="template_results-table__head--empty">
65-
<tr id="not-found-message">
66-
<th colspan="4">No results found. Check the filters.</th>
67-
</tr>
68-
</template>
6970
<!-- END TEMPLATES -->
7071
<div class="summary">
7172
<div class="summary__data">
7273
<h2>Summary</h2>
73-
{%- for p in additional_summary['prefix'] %}
74-
{{ p|safe }}
75-
{%- endfor %}
74+
<div class="additional-summary prefix">
75+
{%- for p in additional_summary['prefix'] %}
76+
{{ p|safe }}
77+
{%- endfor %}
78+
</div>
7679
<p class="run-count">{{ run_count }}</p>
7780
<p class="filter">(Un)check the boxes to filter the results.</p>
7881
<div class="summary__reload">
@@ -81,25 +84,29 @@
8184
</div>
8285
</div>
8386
<div class="summary__spacer"></div>
84-
<div class="controls">
85-
<div class="filters">
86-
{%- for result, values in outcomes.items() %}
87-
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="{{ result }}" {{ "disabled" if values["value"] == 0 }}/>
88-
<span class="{{ result }}">{{ values["value"] }} {{ values["label"] }}{{ "," if result != "rerun" }}</span>
89-
{%- endfor %}
90-
</div>
91-
<div class="collapse">
92-
<button id="show_all_details">Show all details</button>&nbsp;/&nbsp;<button id="hide_all_details">Hide all details</button>
93-
<div>
87+
<div class="controls">
88+
<div class="filters">
89+
{%- for result, values in outcomes.items() %}
90+
<input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="{{ result }}" {{ "disabled" if values["value"] == 0 }}/>
91+
<span class="{{ result }}">{{ values["value"] }} {{ values["label"] }}{{ "," if result != "rerun" }}</span>
92+
{%- endfor %}
93+
</div>
94+
<div class="collapse">
95+
<button id="show_all_details">Show all details</button>&nbsp;/&nbsp;<button id="hide_all_details">Hide all details</button>
9496
</div>
9597
</div>
9698
</div>
97-
{%- for s in additional_summary['summary'] %}
98-
{{ s|safe }}
99-
{%- endfor %}
100-
{%- for p in additional_summary['postfix'] %}
101-
{{ p|safe }}
102-
{%- endfor %}
99+
<div class="additional-summary summary">
100+
{%- for s in additional_summary['summary'] %}
101+
{{ s|safe }}
102+
{%- endfor %}
103+
</div>
104+
<div class="additional-summary postfix">
105+
{%- for p in additional_summary['postfix'] %}
106+
{{ p|safe }}
107+
{%- endfor %}
108+
</div>
109+
</div>
103110
<table id="results-table"></table>
104111
</body>
105112
<footer>

src/pytest_html/scripts/dom.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
const mediaViewer = require('./mediaviewer.js')
22
const templateEnvRow = document.getElementById('template_environment_row')
33
const templateResult = document.getElementById('template_results-table__tbody')
4-
const listHeaderEmpty = document.getElementById('template_results-table__head--empty')
54

65
function htmlToElements(html) {
76
const temp = document.createElement('template')
@@ -37,7 +36,6 @@ const dom = {
3736

3837
return envRow
3938
},
40-
getListHeaderEmpty: () => listHeaderEmpty.content.cloneNode(true),
4139
getResultTBody: ({ testId, id, log, duration, extras, resultsTableRow, tableHtml, result, collapsed }) => {
4240
const resultLower = result.toLowerCase()
4341
const resultBody = templateResult.content.cloneNode(true)

src/pytest_html/scripts/main.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,14 @@ const renderContent = (tests) => {
3838
removeChildren(table)
3939

4040
tableHeader.querySelector(`.sortable[data-column-type="${sortAttr}"]`)?.classList.add(sortAsc ? 'desc' : 'asc')
41+
table.appendChild(tableHeader)
4142
if (!rows.length) {
42-
tableHeader.appendChild(dom.getListHeaderEmpty())
43+
const emptyTable = document.getElementById('template_results-table__body--empty').content.cloneNode(true)
44+
table.appendChild(emptyTable)
4345
}
44-
table.appendChild(tableHeader)
4546

4647
rows.forEach((row) => !!row && table.appendChild(row))
4748

48-
table.querySelectorAll('.extra').forEach((item) => {
49-
item.colSpan = document.querySelectorAll('th').length
50-
})
51-
5249
findAll('.sortable').forEach((elem) => {
5350
elem.addEventListener('click', (evt) => {
5451
const { target: element } = evt

testing/test_integration.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ def run(pytester, path="report.html", cmd_flags=None, query_params=None):
5252
# End workaround
5353

5454
driver.get(f"file:///reports{path}?{query_params}")
55-
return BeautifulSoup(driver.page_source, "html.parser")
55+
soup = BeautifulSoup(driver.page_source, "html.parser")
56+
57+
# remove all templates as they bork the BS parsing
58+
for template in soup("template"):
59+
template.decompose()
60+
61+
return soup
5662
finally:
5763
driver.quit()
5864

@@ -88,15 +94,15 @@ def get_text(page, selector):
8894

8995

9096
def is_collapsed(page, test_name):
91-
return get_element(page, f".summary tbody[id$='{test_name}'] .collapsed")
97+
return get_element(page, f"tbody[id$='{test_name}'] .collapsed")
9298

9399

94100
def get_log(page, test_id=None):
95101
# TODO(jim) move to get_text (use .contents)
96102
if test_id:
97-
log = get_element(page, f".summary tbody[id$='{test_id}'] div[class='log']")
103+
log = get_element(page, f"tbody[id$='{test_id}'] div[class='log']")
98104
else:
99-
log = get_element(page, ".summary div[class='log']")
105+
log = get_element(page, "div[class='log']")
100106
all_text = ""
101107
for text in log.strings:
102108
all_text += text
@@ -195,7 +201,7 @@ def test_skip():
195201
page = run(pytester)
196202
assert_results(page, skipped=1, total_tests=0)
197203

198-
log = get_text(page, ".summary div[class='log']")
204+
log = get_text(page, "div[class='log']")
199205
assert_that(log).contains(reason)
200206

201207
def test_skip_function_marker(self, pytester):
@@ -211,7 +217,7 @@ def test_skip():
211217
page = run(pytester)
212218
assert_results(page, skipped=1, total_tests=0)
213219

214-
log = get_text(page, ".summary div[class='log']")
220+
log = get_text(page, "div[class='log']")
215221
assert_that(log).contains(reason)
216222

217223
def test_skip_class_marker(self, pytester):
@@ -228,15 +234,15 @@ def test_skip():
228234
page = run(pytester)
229235
assert_results(page, skipped=1, total_tests=0)
230236

231-
log = get_text(page, ".summary div[class='log']")
237+
log = get_text(page, "div[class='log']")
232238
assert_that(log).contains(reason)
233239

234240
def test_fail(self, pytester):
235241
pytester.makepyfile("def test_fail(): assert False")
236242
page = run(pytester)
237243
assert_results(page, failed=1)
238244
assert_that(get_log(page)).contains("AssertionError")
239-
assert_that(get_text(page, ".summary div[class='log'] span.error")).matches(
245+
assert_that(get_text(page, "div[class='log'] span.error")).matches(
240246
r"^E\s+assert False$"
241247
)
242248

@@ -352,7 +358,7 @@ def test_function(arg):
352358
page = run(pytester)
353359
assert_results(page, error=1, total_tests=0)
354360

355-
col_name = get_text(page, ".summary td[class='col-name']")
361+
col_name = get_text(page, "td[class='col-name']")
356362
assert_that(col_name).contains("::setup")
357363
assert_that(get_log(page)).contains("ValueError")
358364

@@ -411,7 +417,9 @@ def pytest_html_results_summary(prefix, summary, postfix):
411417
pytester.makepyfile("def test_pass(): pass")
412418
page = run(pytester)
413419

414-
elements = page.select(".summary__data p:not(.run-count):not(.filter)")
420+
elements = page.select(
421+
".additional-summary p"
422+
) # ".summary__data p:not(.run-count):not(.filter)")
415423
assert_that(elements).is_length(3)
416424
for element in elements:
417425
key = re.search(r"(\w+).*", element.string).group(1)
@@ -437,7 +445,7 @@ def pytest_runtest_makereport(item, call):
437445
pytester.makepyfile("def test_pass(): pass")
438446
page = run(pytester)
439447

440-
assert_that(page.select_one(".summary .extraHTML").string).is_equal_to(content)
448+
assert_that(page.select_one(".extraHTML").string).is_equal_to(content)
441449

442450
@pytest.mark.parametrize(
443451
"content, encoded",
@@ -460,7 +468,7 @@ def pytest_runtest_makereport(item, call):
460468
pytester.makepyfile("def test_pass(): pass")
461469
page = run(pytester, cmd_flags=["--self-contained-html"])
462470

463-
element = page.select_one(".summary a[class='col-links__extra text']")
471+
element = page.select_one("a[class='col-links__extra text']")
464472
assert_that(element.string).is_equal_to("Text")
465473
assert_that(element["href"]).is_equal_to(
466474
f"data:text/plain;charset=utf-8;base64,{encoded}"
@@ -488,7 +496,7 @@ def pytest_runtest_makereport(item, call):
488496
content_str = json.dumps(content)
489497
data = b64encode(content_str.encode("utf-8")).decode("ascii")
490498

491-
element = page.select_one(".summary a[class='col-links__extra json']")
499+
element = page.select_one("a[class='col-links__extra json']")
492500
assert_that(element.string).is_equal_to("JSON")
493501
assert_that(element["href"]).is_equal_to(
494502
f"data:application/json;charset=utf-8;base64,{data}"
@@ -512,7 +520,7 @@ def pytest_runtest_makereport(item, call):
512520
pytester.makepyfile("def test_pass(): pass")
513521
page = run(pytester)
514522

515-
element = page.select_one(".summary a[class='col-links__extra url']")
523+
element = page.select_one("a[class='col-links__extra url']")
516524
assert_that(element.string).is_equal_to("URL")
517525
assert_that(element["href"]).is_equal_to(content)
518526

@@ -551,7 +559,7 @@ def pytest_runtest_makereport(item, call):
551559
# assert_that(element.string).is_equal_to("Image")
552560
# assert_that(element["href"]).is_equal_to(src)
553561

554-
element = page.select_one(".summary .media img")
562+
element = page.select_one(".media img")
555563
assert_that(str(element)).is_equal_to(f'<img src="{src}"/>')
556564

557565
@pytest.mark.parametrize("mime_type, extension", [("video/mp4", "mp4")])
@@ -579,7 +587,7 @@ def pytest_runtest_makereport(item, call):
579587
# assert_that(element.string).is_equal_to("Video")
580588
# assert_that(element["href"]).is_equal_to(src)
581589

582-
element = page.select_one(".summary .media video")
590+
element = page.select_one(".media video")
583591
assert_that(str(element)).is_equal_to(
584592
f'<video controls="">\n<source src="{src}" type="{mime_type}"/>\n</video>'
585593
)
@@ -590,10 +598,8 @@ def test_xdist(self, pytester):
590598
assert_results(page, passed=1)
591599

592600
def test_results_table_hook_append(self, pytester):
593-
header_selector = (
594-
".summary #results-table-head tr:nth-child(1) th:nth-child({})"
595-
)
596-
row_selector = ".summary #results-table tr:nth-child(1) td:nth-child({})"
601+
header_selector = "#results-table-head tr:nth-child(1) th:nth-child({})"
602+
row_selector = "#results-table tr:nth-child(1) td:nth-child({})"
597603

598604
pytester.makeconftest(
599605
"""
@@ -628,10 +634,8 @@ def pytest_html_results_table_row(report, cells):
628634
)
629635

630636
def test_results_table_hook_insert(self, pytester):
631-
header_selector = (
632-
".summary #results-table-head tr:nth-child(1) th:nth-child({})"
633-
)
634-
row_selector = ".summary #results-table tr:nth-child(1) td:nth-child({})"
637+
header_selector = "#results-table-head tr:nth-child(1) th:nth-child({})"
638+
row_selector = "#results-table tr:nth-child(1) td:nth-child({})"
635639

636640
pytester.makeconftest(
637641
"""
@@ -700,12 +704,10 @@ def pytest_html_results_table_row(report, cells):
700704
pytester.makepyfile("def test_pass(): pass")
701705
page = run(pytester)
702706

703-
header_columns = page.select(".summary #results-table-head th")
707+
header_columns = page.select("#results-table-head th")
704708
assert_that(header_columns).is_length(3)
705709

706-
row_columns = page.select_one(".summary .results-table-row").select(
707-
"td:not(.extra)"
708-
)
710+
row_columns = page.select_one(".results-table-row").select("td:not(.extra)")
709711
assert_that(row_columns).is_length(3)
710712

711713
@pytest.mark.parametrize("no_capture", ["", "-s"])

0 commit comments

Comments
 (0)