Files
FabledSteward/tests/_templates.py
T
bvandeusenandClaude Opus 5.5 6caf737917
CI / lint (push) Successful in 2s
CI / integration (push) Successful in 52s
CI / unit (push) Successful in 1m10s
CI / publish (push) Successful in 1m27s
test: render plugin templates through render_template with the plugin's folder in front (#5122)
Calling app.update_template_context directly failed in CI (run 8386:
"missing 1 required positional argument: 'context'"). Rather than
reproduce Quart's render path, the helper puts the plugin's template
folder ahead of the app's loader for the one render and calls
quart.render_template, which supplies the request context as it does
for every page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 18:06:04 -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