Files
FabledSteward/tests/plugins/docker/test_routes.py
T
bvandeusen 626ba69934
CI / lint (push) Successful in 2s
CI / unit (push) Successful in 48s
CI / integration (push) Successful in 2m16s
CI / publish (push) Successful in 1m14s
test(docker): parse-check templates + smoke routes/_human_bytes (milestone 77 #943)
CI never renders docker templates through the app (the unit-lane app uses
testing=True, which skips plugin loading), so a Jinja syntax error could ship
green. Add unit tests that parse every docker template, smoke-import the routes
module + confirm the #942 view functions exist, and cover the _human_bytes /
_human_uptime presentation helpers. Closes the render-regression gap the new UI
pages introduced.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Jg27rgypiW2efULXJDtMC
2026-06-18 22:04:11 -04:00

51 lines
1.8 KiB
Python

"""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))