Skip to content

Fix: results table html hook #669

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 25 additions & 5 deletions src/pytest_html/basereport.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from pytest_html import __version__
from pytest_html import extras
from pytest_html.table import Header
from pytest_html.table import Html
from pytest_html.table import Row
from pytest_html.util import _ansi_styles
from pytest_html.util import cleanup_unserializable
Expand Down Expand Up @@ -210,15 +209,18 @@ def pytest_runtest_logreport(self, report):
if row_cells.html is None:
return
data["resultsTableRow"] = row_cells.html
for sortable, value in row_cells.sortables.items():
data[sortable] = value

table_html = Html()
self._config.hook.pytest_html_results_table_html(report=report, data=table_html)
data["tableHtml"] = table_html.html["html"]
processed_logs = _process_logs(report)
self._config.hook.pytest_html_results_table_html(
report=report, data=processed_logs
)

data["result"] = _process_outcome(report)
data["extras"] = self._process_extras(report, test_id)

if self._report.add_test(data, report, row_cells, table_html.replace_log):
if self._report.add_test(data, report, processed_logs):
self._generate_report()


Expand Down Expand Up @@ -252,6 +254,24 @@ def _is_error(report):
return report.when in ["setup", "teardown"] and report.outcome == "failed"


def _process_logs(report):
log = []
if report.longreprtext:
log.append(report.longreprtext.replace("<", "&lt;").replace(">", "&gt;") + "\n")
for section in report.sections:
header, content = section
log.append(f"{' ' + header + ' ':-^80}\n{content}")

# weird formatting related to logs
if "log" in header:
log.append("")
if "call" in header:
log.append("")
if not log:
log.append("No log output captured.")
return log


def _process_outcome(report):
if _is_error(report):
return "Error"
Expand Down
33 changes: 4 additions & 29 deletions src/pytest_html/report_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,16 @@ def data(self):
def set_data(self, key, value):
self._data[key] = value

def add_test(self, test_data, report, row, remove_log=False):
for sortable, value in row.sortables.items():
test_data[sortable] = value

def add_test(self, test_data, report, logs):
# regardless of pass or fail we must add teardown logging to "call"
if report.when == "teardown" and not remove_log:
if report.when == "teardown":
self.update_test_log(report)

# passed "setup" and "teardown" are not added to the html
if report.when == "call" or (
report.when in ["setup", "teardown"] and report.outcome != "passed"
):
if not remove_log:
processed_logs = _process_logs(report)
test_data["log"] = _handle_ansi(processed_logs)
test_data["log"] = _handle_ansi("\n".join(logs))
self._data["tests"][report.nodeid].append(test_data)
return True

Expand All @@ -79,25 +74,5 @@ def update_test_log(self, report):
for section in report.sections:
header, content = section
if "teardown" in header:
log.append(f"{' ' + header + ' ':-^80}")
log.append(content)
log.append(f"{' ' + header + ' ':-^80}\n{content}")
test["log"] += _handle_ansi("\n".join(log))


def _process_logs(report):
log = []
if report.longreprtext:
log.append(report.longreprtext.replace("<", "&lt;").replace(">", "&gt;") + "\n")
for section in report.sections:
header, content = section
log.append(f"{' ' + header + ' ':-^80}")
log.append(content)

# weird formatting related to logs
if "log" in header:
log.append("")
if "call" in header:
log.append("")
if not log:
log.append("No log output captured.")
return "\n".join(log)
20 changes: 3 additions & 17 deletions src/pytest_html/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,9 @@ def __init__(self):
def html(self):
return self._html


class Html(Table):
def __init__(self):
super().__init__()
self.html.setdefault("html", [])
self._replace_log = False

def __delitem__(self, key):
# This means the log should be removed
self._replace_log = True

@property
def replace_log(self):
return self._replace_log

def append(self, html):
self.html["html"].append(html)
@html.setter
def html(self, value):
self._html = value


class Cell(Table):
Expand Down