|
2 | 2 |
|
3 | 3 | import sys
|
4 | 4 | from pathlib import Path
|
5 |
| -from typing import TYPE_CHECKING |
| 5 | +from typing import TYPE_CHECKING, Any |
6 | 6 |
|
7 | 7 | import pytest
|
| 8 | +from jinja2 import DictLoader, Environment |
8 | 9 |
|
9 | 10 | from litestar import Litestar, MediaType, get
|
10 | 11 | from litestar.contrib.jinja import JinjaTemplateEngine
|
@@ -52,6 +53,39 @@ def callback(engine: TemplateEngineProtocol) -> None:
|
52 | 53 | assert received_engine is app.template_engine
|
53 | 54 |
|
54 | 55 |
|
| 56 | +def test_engine_passed_to_callback_custom_env(tmp_path: Path) -> None: |
| 57 | + received_engine: JinjaTemplateEngine | None = None |
| 58 | + |
| 59 | + def callback(engine: TemplateEngineProtocol) -> None: |
| 60 | + nonlocal received_engine |
| 61 | + assert isinstance(engine, JinjaTemplateEngine), "Engine must be a JinjaTemplateEngine" |
| 62 | + received_engine = engine |
| 63 | + engine.register_template_callable( |
| 64 | + key="check_context_key", |
| 65 | + template_callable=my_template_function, |
| 66 | + ) |
| 67 | + |
| 68 | + def my_template_function(ctx: dict[str, Any]) -> str: |
| 69 | + return ctx.get("my_context_key", "nope") |
| 70 | + |
| 71 | + my_custom_env = Environment(loader=DictLoader({"index.html": "check_context_key: {{ check_context_key() }}"})) |
| 72 | + template_config = TemplateConfig( |
| 73 | + instance=JinjaTemplateEngine.from_environment(my_custom_env), |
| 74 | + engine_callback=callback, |
| 75 | + ) |
| 76 | + app = Litestar(template_config=template_config) |
| 77 | + |
| 78 | + @get("/") |
| 79 | + def handler() -> Template: |
| 80 | + return Template(template_name="index.html") |
| 81 | + |
| 82 | + assert received_engine is not None |
| 83 | + assert received_engine is app.template_engine |
| 84 | + with create_test_client(route_handlers=[handler], template_config=template_config) as client: |
| 85 | + response = client.get("/") |
| 86 | + assert response.text == "check_context_key: nope" |
| 87 | + |
| 88 | + |
55 | 89 | @pytest.mark.parametrize("engine", (JinjaTemplateEngine, MakoTemplateEngine, MiniJinjaTemplateEngine))
|
56 | 90 | def test_engine_instance(engine: type[TemplateEngineProtocol], tmp_path: Path) -> None:
|
57 | 91 | engine_instance = engine(directory=tmp_path, engine_instance=None)
|
|
0 commit comments