test_makemessages.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. from django.test import TestCase
  2. from misago.core.management.commands.makemessages import (
  3. HandlebarsExpression, HandlebarsTemplate, HandlebarsFile)
  4. class HandlebarsExpressionTests(TestCase):
  5. def test_get_i18n_helpers(self):
  6. """expression parser finds i18n helpers"""
  7. expression = HandlebarsExpression("some.expression")
  8. self.assertFalse(expression.get_i18n_helpers())
  9. expression = HandlebarsExpression("bind-attr src=user.avatar")
  10. self.assertFalse(expression.get_i18n_helpers())
  11. expression = HandlebarsExpression("gettext 'misiek'")
  12. self.assertTrue(expression.get_i18n_helpers())
  13. expression = HandlebarsExpression("gettext '%(user)s has %(trait)s' user=user.username trait=(gettext user.trait)")
  14. helpers = expression.get_i18n_helpers()
  15. self.assertEqual(len(helpers), 2)
  16. self.assertEqual(helpers[0], ['gettext', "'%(user)s has %(trait)s'"])
  17. self.assertEqual(helpers[1], ['gettext', "user.trait"])
  18. expression = HandlebarsExpression('gettext "%(param)s!" param = (gettext "nested once" param = (gettext "nested twice")) otherparam= (gettext "nested once again")')
  19. helpers = expression.get_i18n_helpers()
  20. self.assertEqual(len(helpers), 4)
  21. self.assertEqual(helpers[0], ['gettext', '"%(param)s!"'])
  22. self.assertEqual(helpers[1], ['gettext', '"nested once"'])
  23. self.assertEqual(helpers[2], ['gettext', '"nested twice"'])
  24. self.assertEqual(helpers[3], ['gettext', '"nested once again"'])
  25. class HandlebarsTemplateTests(TestCase):
  26. def test_empty_file(self):
  27. """empty file causes no errors"""
  28. template = HandlebarsTemplate("")
  29. self.assertEqual(template.get_converted_content(), "")
  30. def test_stripped_expression(self):
  31. """non-i18n expression is stripped"""
  32. template = HandlebarsTemplate("{{ some.expression }}")
  33. self.assertEqual(template.get_converted_content(), "")
  34. def test_invalid_expression_stripping(self):
  35. """invalid i18n expressions are stripped"""
  36. template = HandlebarsTemplate("{{gettext }}")
  37. self.assertEqual(template.get_converted_content(), "")
  38. template = HandlebarsTemplate("{{ngettext }}")
  39. self.assertEqual(template.get_converted_content(), "")
  40. template = HandlebarsTemplate("{{ngettext 'apple' }}")
  41. self.assertEqual(template.get_converted_content(), "")
  42. template = HandlebarsTemplate("{{ngettext 'apple' 'apples' }}")
  43. self.assertEqual(template.get_converted_content(), "")
  44. template = HandlebarsTemplate("{{gettext_noop }}")
  45. self.assertEqual(template.get_converted_content(), "")
  46. template = HandlebarsTemplate("{{pgettext }}")
  47. self.assertEqual(template.get_converted_content(), "")
  48. template = HandlebarsTemplate("{{pgettext 'apple' }}")
  49. self.assertEqual(template.get_converted_content(), "")
  50. template = HandlebarsTemplate("{{npgettext 'fruit' 'apple' }}")
  51. self.assertEqual(template.get_converted_content(), "")
  52. def test_valid_expression_replace(self):
  53. """valid i18n expressions are replaced"""
  54. VALID_CASES = (
  55. '%s',
  56. 'unbound %s',
  57. 'something (%s)',
  58. 'unbound something (%s)',
  59. 'if condition (%s)',
  60. 'something "lorem ipsum" some.var kwarg=(%s) otherkwarg=(helper something)'
  61. )
  62. for case in VALID_CASES:
  63. self.subtest("{{%s}}" % case)
  64. self.subtest("{{ %s }}" % case)
  65. self.subtest("{{{%s}}}" % case)
  66. self.subtest("{{{ %s }}}" % case)
  67. def subtest(self, case_template):
  68. CASES = (
  69. (
  70. "gettext 'Lorem ipsum'",
  71. "gettext('Lorem ipsum');"
  72. ),
  73. (
  74. "gettext 'Lorem %(vis)s' vis=name",
  75. "gettext('Lorem %(vis)s');"
  76. ),
  77. (
  78. "gettext 'Lorem %(vis)s' vis=(gettext user.vis)",
  79. "gettext('Lorem %(vis)s'); gettext(user.vis);"
  80. ),
  81. (
  82. "gettext some_variable",
  83. "gettext(some_variable);"
  84. ),
  85. (
  86. "gettext 'Lorem ipsum'",
  87. "gettext('Lorem ipsum');"
  88. ),
  89. (
  90. "gettext 'Lorem %(vis)s' vis=name",
  91. "gettext('Lorem %(vis)s');"
  92. ),
  93. (
  94. "gettext some_variable",
  95. "gettext(some_variable);"
  96. ),
  97. (
  98. "gettext some_variable user=user.username",
  99. "gettext(some_variable);"
  100. ),
  101. (
  102. "ngettext '%(count)s apple' '%(count)s apples' apples_count",
  103. "ngettext('%(count)s apple', '%(count)s apples', apples_count);"
  104. ),
  105. (
  106. "ngettext '%(user)s has %(count)s apple' '%(user)s has %(count)s apples' apples_count user=user.username",
  107. "ngettext('%(user)s has %(count)s apple', '%(user)s has %(count)s apples', apples_count);"
  108. ),
  109. (
  110. "ngettext apple apples apples_count",
  111. "ngettext(apple, apples, apples_count);"
  112. ),
  113. (
  114. "ngettext '%(count)s apple' apples apples_count",
  115. "ngettext('%(count)s apple', apples, apples_count);"
  116. ),
  117. (
  118. "ngettext '%(user)s has %(count)s apple' apples apples_count user=user.username",
  119. "ngettext('%(user)s has %(count)s apple', apples, apples_count);"
  120. ),
  121. (
  122. "gettext_noop 'Lorem ipsum'",
  123. "gettext_noop('Lorem ipsum');"
  124. ),
  125. (
  126. "gettext_noop 'Lorem %(vis)s' vis=name",
  127. "gettext_noop('Lorem %(vis)s');"
  128. ),
  129. (
  130. "gettext_noop some_variable",
  131. "gettext_noop(some_variable);"
  132. ),
  133. (
  134. "gettext_noop 'Lorem ipsum'",
  135. "gettext_noop('Lorem ipsum');"
  136. ),
  137. (
  138. "gettext_noop 'Lorem %(vis)s' vis=name",
  139. "gettext_noop('Lorem %(vis)s');"
  140. ),
  141. (
  142. "gettext_noop some_variable",
  143. "gettext_noop(some_variable);"
  144. ),
  145. (
  146. "pgettext 'month' 'may'",
  147. "pgettext('month', 'may');"
  148. ),
  149. (
  150. "pgettext 'month' month_name",
  151. "pgettext('month', month_name);"
  152. ),
  153. (
  154. "pgettext 'day of month' 'May, %(day)s' day=calendar.day",
  155. "pgettext('day of month', 'May, %(day)s');"
  156. ),
  157. (
  158. "pgettext context value day=calendar.day",
  159. "pgettext(context, value);"
  160. ),
  161. (
  162. "npgettext 'fruits' '%(count)s apple' '%(count)s apples' apples_count",
  163. "npgettext('fruits', '%(count)s apple', '%(count)s apples', apples_count);"
  164. ),
  165. (
  166. "npgettext 'fruits' '%(user)s has %(count)s apple' '%(user)s has %(count)s apples' apples_count user=user.username",
  167. "npgettext('fruits', '%(user)s has %(count)s apple', '%(user)s has %(count)s apples', apples_count);"
  168. ),
  169. (
  170. "npgettext context apple apples apples_count",
  171. "npgettext(context, apple, apples, apples_count);"
  172. ),
  173. (
  174. "npgettext context '%(count)s apple' apples apples_count",
  175. "npgettext(context, '%(count)s apple', apples, apples_count);"
  176. ),
  177. (
  178. "npgettext 'fruits' '%(user)s has %(count)s apple' apples apples_count user=user.username",
  179. "npgettext('fruits', '%(user)s has %(count)s apple', apples, apples_count);"
  180. ),
  181. )
  182. assertion_msg = """
  183. HBS template was parsed incorrectly:
  184. input: %s
  185. output: %s
  186. expected: %s
  187. """
  188. for test, expected_output in CASES:
  189. test_input = case_template % test
  190. template = HandlebarsTemplate(case_template % test)
  191. test_output = template.get_converted_content()
  192. self.assertEqual(
  193. test_output, expected_output,
  194. assertion_msg % (test_input, test_output, expected_output))
  195. def test_multiple_expressions(self):
  196. """multiple expressions are handled"""
  197. template = HandlebarsTemplate("{{gettext 'Posted by:'}} <strong>{{gettext user.rank.title}}</strong>; <em>{{ user.city }}</em>")
  198. self.assertEqual(template.get_converted_content(),
  199. "gettext('Posted by:');gettext(user.rank.title);")
  200. template = HandlebarsTemplate("""{{gettext 'Posted by:'}}<br>
  201. {{gettext user.rank.title}}""")
  202. self.assertEqual(template.get_converted_content(),
  203. "gettext('Posted by:');\ngettext(user.rank.title);")
  204. template = HandlebarsTemplate("""<h1>{{ thread.title }}</h1>
  205. {{gettext 'Posted by:'}}<br>
  206. {{gettext user.rank.title}}""")
  207. self.assertEqual(template.get_converted_content(),
  208. "\ngettext('Posted by:');\n\ngettext(user.rank.title);")
  209. class HandlebarsFileTests(TestCase):
  210. def test_make_js_path(self):
  211. """Object correctly translates hbs path to temp js path"""
  212. hbs_path = "templates/application.hbs"
  213. test_file = HandlebarsFile(hbs_path, False)
  214. suffix = test_file.make_js_path_suffix(hbs_path)
  215. self.assertTrue(suffix.endswith(".makemessages.js"))
  216. js_path = test_file.make_js_path(hbs_path, suffix)
  217. self.assertTrue(js_path.startswith(hbs_path))
  218. self.assertTrue(js_path.endswith(suffix))