diff --git a/src/pytest_html/basereport.py b/src/pytest_html/basereport.py index 969a0fee..2f169110 100644 --- a/src/pytest_html/basereport.py +++ b/src/pytest_html/basereport.py @@ -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 @@ -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() @@ -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("<", "<").replace(">", ">") + "\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" diff --git a/src/pytest_html/report_data.py b/src/pytest_html/report_data.py index 77fdb1b8..aee5e938 100644 --- a/src/pytest_html/report_data.py +++ b/src/pytest_html/report_data.py @@ -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 @@ -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("<", "<").replace(">", ">") + "\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) diff --git a/src/pytest_html/table.py b/src/pytest_html/table.py index 54aafa9e..8eea6579 100644 --- a/src/pytest_html/table.py +++ b/src/pytest_html/table.py @@ -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):