1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-19 05:58:09 +00:00
trezor-firmware/tests/ui_tests/reporting/html.py

99 lines
2.7 KiB
Python
Raw Normal View History

2023-01-27 14:13:12 +00:00
from __future__ import annotations
import shutil
from pathlib import Path
2023-01-27 14:13:12 +00:00
from typing import Iterable
from dominate import document
from dominate.tags import a, i, img, table, td, th, tr
2023-01-27 14:13:12 +00:00
from PIL import Image
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(
2023-01-27 14:13:12 +00:00
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, "")):
path = test.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
2023-01-27 14:13:12 +00:00
def image_column(hash: str | None, cur_dir: Path) -> None:
"""Put image into table as one cell."""
with td():
2023-01-27 14:13:12 +00:00
if hash:
image_link(hash, cur_dir)
else:
i("missing")
2023-01-27 14:13:12 +00:00
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 = "") -> None:
"""Put image into table as one cell."""
path = _IMAGE_DIR / f"{hash}.png"
im = Image.open(path)
width = im.width
if width < 240:
width *= 2
img(
2023-01-27 14:13:12 +00:00
src=_relative_path(cur_dir, path),
style=f"width: {width}px; image-rendering: pixelated;",
title=title,
loading="lazy",
)
2023-01-27 14:13:12 +00:00
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):
2023-01-27 14:13:12 +00:00
image_column(left, cur_dir)
image_column(right, cur_dir)