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

1# Tests jinja template rendering 

2 

3from typing import Any 

4from unittest.mock import patch 

5 

6from jinja2 import Environment 

7 

8from couchers.templates.v2 import ( 

9 CONTEXT_PLAINTEXT_KEY, 

10 CONTEXT_TRANSLATION_COMPONENT_KEY, 

11 CONTEXT_TRANSLATION_LANGUAGE_KEY, 

12 add_filters, 

13) 

14 

15_env = Environment() 

16add_filters(_env) 

17 

18 

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 

35 

36 with patch("couchers.i18n.i18n.get_translations", new=lambda: translation_dict): 

37 return template.render(template_args) 

38 

39 

40def _greeting_dict(value: str) -> dict: 

41 return {"en": {"component": {"greeting": value}}} 

42 

43 

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!" 

49 

50 

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!" 

58 

59 

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!" 

67 

68 

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, &lt;script /&gt;!" 

76 

77 

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>" 

83 

84 

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!" 

90 

91 

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!" 

97 

98 

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!>"