Coverage for src/tests/test_templates.py: 100%
39 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-20 11:53 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-12-20 11:53 +0000
1# Tests jinja template rendering
3from typing import Any
4from unittest.mock import patch
6from jinja2 import Environment
8from couchers.templates.v2 import (
9 CONTEXT_PLAINTEXT_KEY,
10 CONTEXT_TRANSLATION_COMPONENT_KEY,
11 CONTEXT_TRANSLATION_LANGUAGE_KEY,
12 add_filters,
13)
15_env = Environment()
16add_filters(_env)
19def _render_template(
20 template_str: str,
21 translation_dict: dict,
22 template_args: dict[str, Any] | None = None,
23 plain: bool = False,
24 component: str = "component",
25 lang: str = "en",
26) -> str:
27 template = _env.from_string(template_str)
28 template_args = {
29 **(template_args or {}),
30 CONTEXT_TRANSLATION_LANGUAGE_KEY: lang,
31 CONTEXT_TRANSLATION_COMPONENT_KEY: component,
32 }
33 if plain:
34 template_args[CONTEXT_PLAINTEXT_KEY] = True
36 with patch("couchers.i18n.i18n.get_translations", new=lambda: translation_dict):
37 return template.render(template_args)
40def _greeting_dict(value: str) -> dict:
41 return {"en": {"component": {"greeting": value}}}
44def test_v2translate_no_substitutions() -> None:
45 translated = _render_template(
46 template_str='{{ "greeting"|v2translate }}', translation_dict=_greeting_dict("Hello!")
47 )
48 assert translated == "Hello!"
51def test_v2translate_multiple_languages() -> None:
52 translated = _render_template(
53 template_str='{{ "greeting"|v2translate }}',
54 lang="fr",
55 translation_dict={"en": {"component": {"greeting": "Hello!"}}, "fr": {"component": {"greeting": "Bonjour!"}}},
56 )
57 assert translated == "Bonjour!"
60def test_v2translate_with_substitutions() -> None:
61 translated = _render_template(
62 template_str='{{ "greeting"|v2translate(name=user_name) }}',
63 template_args={"user_name": "Jack"},
64 translation_dict=_greeting_dict("Hello, {{name}}!"),
65 )
66 assert translated == "Hello, Jack!"
69def test_v2translate_escaping() -> None:
70 translated = _render_template(
71 template_str='{{ "greeting"|v2translate(name=name) }}',
72 template_args={"name": "<script />"},
73 translation_dict=_greeting_dict("Hello, {{name}}!"),
74 )
75 assert translated == "Hello, <script />!"
78def test_v2translate_translation_tags() -> None:
79 translated = _render_template(
80 template_str='{{ "greeting"|v2translate }}', translation_dict=_greeting_dict("<b>Hello!</b>")
81 )
82 assert translated == "<b>Hello!</b>"
85def test_v2translate_newlines_br() -> None:
86 translated = _render_template(
87 template_str='{{ "greeting"|v2translate }}', translation_dict=_greeting_dict("Hello!\nWelcome!")
88 )
89 assert translated == "Hello!<br>Welcome!"
92def test_v2translate_plain_strip_tags() -> None:
93 translated = _render_template(
94 template_str='{{ "greeting"|v2translate }}', plain=True, translation_dict=_greeting_dict("<b>Hello!</b>")
95 )
96 assert translated == "Hello!"
99def test_v2translate_plain_strip_links() -> None:
100 translated = _render_template(
101 template_str='{{ "greeting"|v2translate }}',
102 plain=True,
103 translation_dict=_greeting_dict('<a href="#foo">Hello!</a>'),
104 )
105 assert translated == "<Hello!>"