test: render plugin templates through render_template with the plugin's folder in front (#5122)
CI / lint (push) Successful in 2s
CI / integration (push) Successful in 52s
CI / unit (push) Successful in 1m10s
CI / publish (push) Successful in 1m27s

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>
This commit is contained in:
2026-10-06 18:06:04 -04:00
co-authored by Claude Opus 5.5
parent 6cf04f57e1
commit 6caf737917
+12 -8
View File
@@ -3,6 +3,7 @@ way to render a plugin's template in a test."""
import pathlib
from jinja2 import ChoiceLoader, FileSystemLoader
from quart import render_template
import steward
@@ -16,11 +17,14 @@ def template_files() -> list[pathlib.Path]:
async def render_plugin_template(app, plugin: str, name: str, **ctx) -> str:
"""Render plugins/<plugin>/templates/<name> through the app's own Jinja
environment (its globals, filters and request context), whether or not the
plugin is enabled in this app. Call inside app.test_request_context()."""
env = app.jinja_env.overlay(loader=ChoiceLoader(
[FileSystemLoader(str(REPO / "plugins" / plugin / "templates")), app.jinja_env.loader]))
await app.update_template_context(ctx)
template = env.get_template(name)
return await template.render_async(**ctx) if env.is_async else template.render(**ctx)
"""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