summaryrefslogtreecommitdiff
path: root/addons/mail/tests/test_mail_render.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mail/tests/test_mail_render.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mail/tests/test_mail_render.py')
-rw-r--r--addons/mail/tests/test_mail_render.py191
1 files changed, 191 insertions, 0 deletions
diff --git a/addons/mail/tests/test_mail_render.py b/addons/mail/tests/test_mail_render.py
new file mode 100644
index 00000000..2f14cbca
--- /dev/null
+++ b/addons/mail/tests/test_mail_render.py
@@ -0,0 +1,191 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.mail.tests import common
+from odoo.tests import tagged, users
+
+
+@tagged('mail_render')
+class TestMailRender(common.MailCommon):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestMailRender, cls).setUpClass()
+
+ # activate multi language support
+ cls.env['res.lang']._activate_lang('fr_FR')
+ cls.user_admin.write({'lang': 'en_US'})
+
+ # test records
+ cls.render_object = cls.env['res.partner'].create({
+ 'name': 'TestRecord',
+ 'lang': 'en_US',
+ })
+ cls.render_object_fr = cls.env['res.partner'].create({
+ 'name': 'Element de Test',
+ 'lang': 'fr_FR',
+ })
+
+ # some jinja templates
+ cls.base_jinja_bits = [
+ '<p>Hello</p>',
+ '<p>Hello ${object.name}</p>',
+ """<p>
+% set english = object.lang == 'en_US'
+% if english
+ <span>English Speaker</span>
+% else
+ <span>Other Speaker</span>
+% endif
+</p>"""
+ ]
+ cls.base_jinja_bits_fr = [
+ '<p>Bonjour</p>',
+ '<p>Bonjour ${object.name}</p>',
+ """<p>
+% set english = object.lang == 'en_US'
+% if english
+ <span>Narrateur Anglais</span>
+% else
+ <span>Autre Narrateur</span>
+% endif
+</p>"""
+ ]
+
+ # some qweb templates and their xml ids
+ cls.base_qweb_templates = cls.env['ir.ui.view'].create([
+ {'name': 'TestRender', 'type': 'qweb',
+ 'arch': '<p>Hello</p>',
+ },
+ {'name': 'TestRender2', 'type': 'qweb',
+ 'arch': '<p>Hello <t t-esc="object.name"/></p>',
+ },
+ {'name': 'TestRender3', 'type': 'qweb',
+ 'arch': """<p>
+ <span t-if="object.lang == 'en_US'">English Speaker</span>
+ <span t-else="">Other Speaker</span>
+</p>""",
+ },
+ ])
+ cls.base_qweb_templates_data = cls.env['ir.model.data'].create([
+ {'name': template.name, 'module': 'mail',
+ 'model': template._name, 'res_id': template.id,
+ } for template in cls.base_qweb_templates
+ ])
+ cls.base_qweb_templates_xmlids = [
+ model_data.complete_name
+ for model_data in cls.base_qweb_templates_data
+ ]
+
+ # render result
+ cls.base_rendered = [
+ '<p>Hello</p>',
+ '<p>Hello %s</p>' % cls.render_object.name,
+ """<p>
+ <span>English Speaker</span>
+</p>"""
+ ]
+ cls.base_rendered_fr = [
+ '<p>Bonjour</p>',
+ '<p>Bonjour %s</p>' % cls.render_object_fr.name,
+ """<p>
+ <span>Autre Narrateur</span>
+</p>"""
+ ]
+
+ # link to mail template
+ cls.test_template_jinja = cls.env['mail.template'].create({
+ 'name': 'Test Template',
+ 'subject': cls.base_jinja_bits[0],
+ 'body_html': cls.base_jinja_bits[1],
+ 'model_id': cls.env['ir.model']._get('res.partner').id,
+ 'lang': '${object.lang}'
+ })
+
+ # some translations
+ cls.env['ir.translation'].create({
+ 'type': 'model',
+ 'name': 'mail.template,subject',
+ 'lang': 'fr_FR',
+ 'res_id': cls.test_template_jinja.id,
+ 'src': cls.test_template_jinja.subject,
+ 'value': cls.base_jinja_bits_fr[0],
+ })
+ cls.env['ir.translation'].create({
+ 'type': 'model',
+ 'name': 'mail.template,body_html',
+ 'lang': 'fr_FR',
+ 'res_id': cls.test_template_jinja.id,
+ 'src': cls.test_template_jinja.body_html,
+ 'value': cls.base_jinja_bits_fr[1],
+ })
+ cls.env['ir.model.data'].create({
+ 'name': 'test_template_xmlid',
+ 'module': 'mail',
+ 'model': cls.test_template_jinja._name,
+ 'res_id': cls.test_template_jinja.id,
+ })
+
+ @users('employee')
+ def test_render_jinja(self):
+ source = """<p>
+% set line_statement_variable = 3
+<span>We have ${line_statement_variable} cookies in stock</span>
+<span>We have <% set block_variable = 4 %>${block_variable} cookies in stock</span>
+</p>"""
+ partner = self.env['res.partner'].browse(self.render_object.ids)
+ result = self.env['mail.render.mixin']._render_template(
+ source,
+ partner._name,
+ partner.ids,
+ engine='jinja',
+ )[partner.id]
+ self.assertEqual(result, """<p>
+<span>We have 3 cookies in stock</span>
+<span>We have 4 cookies in stock</span>
+</p>""")
+
+ @users('employee')
+ def test_render_mail_template_jinja(self):
+ template = self.env['mail.template'].browse(self.test_template_jinja.ids)
+ partner = self.env['res.partner'].browse(self.render_object.ids)
+ for fname, expected in zip(['subject', 'body_html'], self.base_rendered):
+ rendered = template._render_field(
+ fname,
+ partner.ids,
+ compute_lang=True
+ )[partner.id]
+ self.assertEqual(rendered, expected)
+
+ partner = self.env['res.partner'].browse(self.render_object_fr.ids)
+ for fname, expected in zip(['subject', 'body_html'], self.base_rendered_fr):
+ rendered = template._render_field(
+ fname,
+ partner.ids,
+ compute_lang=True
+ )[partner.id]
+ self.assertEqual(rendered, expected)
+
+ @users('employee')
+ def test_render_template_jinja(self):
+ partner = self.env['res.partner'].browse(self.render_object.ids)
+ for source, expected in zip(self.base_jinja_bits, self.base_rendered):
+ rendered = self.env['mail.render.mixin']._render_template(
+ source,
+ partner._name,
+ partner.ids,
+ engine='jinja',
+ )[partner.id]
+ self.assertEqual(rendered, expected)
+
+ @users('employee')
+ def test_render_template_qweb(self):
+ partner = self.env['res.partner'].browse(self.render_object.ids)
+ for source, expected in zip(self.base_qweb_templates_xmlids, self.base_rendered):
+ rendered = self.env['mail.render.mixin']._render_template(
+ source,
+ partner._name,
+ partner.ids,
+ engine='qweb',
+ )[partner.id].decode()
+ self.assertEqual(rendered, expected)