Files
FabledSteward/tests/_templates.py
T
bvandeusenandClaude Opus 5.5 a775882bd4 test(docker): a plugin template can take its own name; the overview's assertions follow its new tables (#5299, #5302)
render_plugin_template's first three arguments are positional-only, so the
service page's own `name` reaches the template. The overview names a service
rather than its replica containers, and a stack chip keeps the search it was
clicked under.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:11:46 -04:00

31 lines
1.1 KiB
Python

"""Where Steward's templates live, for the guards that read every one, and a
way to render a plugin's template in a test."""
import pathlib
from jinja2 import ChoiceLoader, FileSystemLoader
from quart import render_template
import steward
REPO = pathlib.Path(steward.__file__).parent.parent
def template_files() -> list[pathlib.Path]:
"""Every first-party .html template: core and each plugin's."""
roots = [REPO / "steward" / "templates", *(REPO / "plugins").glob("*/templates")]
return sorted(p for root in roots for p in root.rglob("*.html"))
async def render_plugin_template(app, plugin: str, name: str, /, **ctx) -> str:
"""Render plugins/<plugin>/templates/<name> with quart.render_template,
whether or not the plugin is enabled in this app: the plugin's template
folder goes ahead of the app's loader for the one render. Call inside
app.test_request_context()."""
loader = app.jinja_env.loader
app.jinja_env.loader = ChoiceLoader(
[FileSystemLoader(str(REPO / "plugins" / plugin / "templates")), loader])
try:
return await render_template(name, **ctx)
finally:
app.jinja_env.loader = loader