Source code for univention.testing.format.html
# SPDX-FileCopyrightText: 2024-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only
"""Format UCS Test results as HTML."""
import sys
from typing import IO
from xml.sax.saxutils import escape as escape_xml
from univention.testing.data import TestEnvironment, TestFormatInterface, TestResult
__all__ = ['HTML']
URI_BUG = 'https://forge.univention.org/bugzilla/show_bug.cgi?id=%s'
URI_OTRS = 'https://gorm.knut.univention.de/otrs/index.pl?Action=AgentTicketSearch&Subaction=Search&TicketNumber=%s'
[docs]
class HTML(TestFormatInterface):
"""Create simple HTML report."""
def __init__(self, stream: IO[str] = sys.stdout) -> None:
super().__init__(stream)
[docs]
def begin_run(self, environment: TestEnvironment, count: int = 1) -> None:
"""Called before first test."""
super().begin_run(environment, count)
print('<html>', file=self.stream)
print('<head>', file=self.stream)
print('<title>ucs-test</title>', file=self.stream)
print('</head>', file=self.stream)
print('<body>', file=self.stream)
[docs]
def begin_section(self, section: str) -> None:
"""Called before each section."""
super().begin_section(section)
print(f'<h2>Section {escape_xml(section)}</h2>', file=self.stream)
print('<table>', file=self.stream)
[docs]
def end_test(self, result: TestResult) -> None:
"""Called after each test."""
title = escape_xml(result.case.uid)
if result.case.description:
title = '<span title="%s">%s</span>' % \
(title, escape_xml(result.case.description))
if result.case.bugs or result.case.otrs:
links = []
links += [
'<a href="%s">Bug #%s</a>' %
(escape_xml(URI_BUG % bug), bug)
for bug in result.case.bugs]
links += [
'<a href="%s">OTRS #%s</a>' %
(escape_xml(URI_OTRS % tick), tick)
for tick in result.case.otrs]
title = '%s (%s)' % (title, ', '.join(links))
msg = '<span style="color:%s;">%s</span>' % \
(result.reason.color.lower(), escape_xml(str(result.reason)))
print(f'<tr><td>{title}</td><td>{msg}</td></tr>', file=self.stream)
super().end_test(result)
[docs]
def end_section(self) -> None:
"""Called after each section."""
print('</table>', file=self.stream)
super().end_section()
[docs]
def end_run(self) -> None:
"""Called after all test."""
print('</body>', file=self.stream)
print('</html>', file=self.stream)
super().end_run()
if __name__ == '__main__':
import doctest
doctest.testmod()