1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-26 09:28:13 +00:00
trezor-firmware/tests/ui_tests/reporting/html.py
2024-03-20 16:54:50 +01:00

105 lines
2.9 KiB
Python

from __future__ import annotations
import shutil
import urllib.parse
from pathlib import Path
from typing import Iterable
from dominate import document
from dominate.tags import a, i, img, table, td, th, tr
from ..common import UI_TESTS_DIR
_IMAGE_DIR = UI_TESTS_DIR / "images"
def set_image_dir(path: Path) -> None:
global _IMAGE_DIR
_IMAGE_DIR = path
def store_images(screens: Iterable[Path], hashes: Iterable[str]) -> None:
for screen, hash in zip(screens, hashes):
shutil.copy(screen, _IMAGE_DIR / f"{hash}.png")
def report_links(
tests: list[Path], reports_path: Path, actual_hashes: dict[str, str] | None = None
) -> None:
if actual_hashes is None:
actual_hashes = {}
if not tests:
i("None!")
return
with table(border=1):
with tr():
th("Link to report")
for test in sorted(tests):
with tr(data_actual_hash=actual_hashes.get(test.stem, "")):
urlsafe = urllib.parse.quote(test.name)
path = test.with_name(urlsafe).relative_to(reports_path)
td(a(test.name, href=path))
def write(fixture_test_path: Path, doc: document, filename: str) -> Path:
(fixture_test_path / filename).write_text(doc.render())
return fixture_test_path / filename
def image_column(hash: str | None, cur_dir: Path, img_id: str | None = None) -> None:
"""Put image into table as one cell."""
with td():
if hash:
image_link(hash, cur_dir, img_id=img_id)
else:
i("missing")
def diff_column() -> None:
"""Put diff image into table as one cell."""
with td(bgcolor="white"):
a("N/A")
def _relative_path(cur_dir: Path, path_to: Path) -> str:
"""Find best relative path to refer to path_to from cur_dir."""
cur_dir = cur_dir.resolve()
path_to = path_to.resolve()
if not cur_dir.is_dir():
cur_dir = cur_dir.parent
common = cur_dir
while common not in path_to.parents:
common = common.parent
ascent = len(cur_dir.parts) - len(common.parts)
relpath = path_to.relative_to(common)
components = [".."] * ascent + list(relpath.parts)
return "/".join(components)
def image_link(
hash: str, cur_dir: Path, title: str = "", img_id: str | None = None
) -> None:
"""Put image into table as one cell."""
path = _IMAGE_DIR / f"{hash}.png"
img(
id=img_id,
src=_relative_path(cur_dir, path),
title=title,
loading="lazy",
onload="imageLoaded(this)",
)
def diff_table(diff: Iterable[tuple[str | None, str | None]], cur_dir: Path) -> None:
for left, right in diff:
if left == right:
background = "white"
else:
background = "red"
with tr(bgcolor=background, onclick="createDiff(this)"):
image_column(left, cur_dir)
image_column(right, cur_dir)
diff_column()