"""Unit tests for the docker plugin's presentation layer (no DB). CI never renders these templates through the running app (the unit-lane app is created with testing=True, which skips plugin loading), so a Jinja syntax error would otherwise ship green. These tests parse every docker template and smoke the routes module so a broken tag or import is caught in the unit lane. """ import pathlib import jinja2 from plugins.docker import routes as r _TEMPLATES = pathlib.Path(r.__file__).parent / "templates" / "docker" def test_all_docker_templates_parse(): env = jinja2.Environment() files = sorted(_TEMPLATES.glob("*.html")) assert files, "no docker templates found" for f in files: # Raises TemplateSyntaxError on an unbalanced/typo'd tag. env.parse(f.read_text()) def test_routes_module_exposes_new_views(): # Import-smoke + confirms the #942 view functions are defined. for name in ("container_detail", "container_history", "swarm", "disk", "index", "rows"): assert callable(getattr(r, name)), name assert r.docker_bp.name == "docker" def test_human_bytes_formats_binary_units(): assert r._human_bytes(None) == "—" assert r._human_bytes(0) == "0 B" assert r._human_bytes(512) == "512 B" assert r._human_bytes(1024) == "1.0 KiB" assert r._human_bytes(1536) == "1.5 KiB" assert r._human_bytes(1024 ** 2) == "1.0 MiB" assert r._human_bytes(int(1.5 * 1024 ** 3)) == "1.5 GiB" assert r._human_bytes(1024 ** 4) == "1.0 TiB" def test_human_uptime_compact(): from datetime import datetime, timedelta, timezone now = datetime.now(timezone.utc) assert r._human_uptime(None) is None assert r._human_uptime(now - timedelta(minutes=8)).endswith("m") assert "h" in r._human_uptime(now - timedelta(hours=5, minutes=12)) assert "d" in r._human_uptime(now - timedelta(days=3, hours=4))