1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import lxml.html
from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon
from odoo.fields import Command
from odoo.tests.common import users, tagged
from odoo.tools import mute_logger
@tagged('mailing_manage')
class TestMailingTest(TestMassMailCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.test_records = cls.env['mailing.test.blacklist'].create([
{
'email_from': f'test.mailing.{idx}@test.example.com',
'name': f'Test Mailing {idx}',
'user_id': cls.user_marketing.id,
}
for idx in range(5)
])
cls.test_mailing_bl = cls.env['mailing.mailing'].create({
'body_html': '<p>Hello <t t-out="object.name"/></p>',
'mailing_domain': [('id', 'in', cls.test_records.ids)],
'mailing_model_id': cls.env['ir.model']._get_id('mailing.test.blacklist'),
'mailing_type': 'mail',
'name': 'TestButton',
'preview': 'Preview {{ object.name }}',
'subject': 'Subject {{ object.name }}',
})
@users('user_marketing')
@mute_logger('odoo.addons.mail.models.mail_render_mixin')
def test_mailing_test_button(self):
mailing = self.test_mailing_bl.with_env(self.env)
mailing_test = self.env['mailing.mailing.test'].create({
'email_to': 'test@test.com',
'mass_mailing_id': mailing.id,
})
with self.mock_mail_gateway():
mailing_test.send_mail_test()
# not great but matches send_mail_test, maybe that should be a method
# on mailing_test?
record = self.env[mailing.mailing_model_real].search([], limit=1)
first_child = lxml.html.fromstring(self._mails.pop()['body']).xpath('//body/*[1]')[0]
self.assertEqual(first_child.tag, 'div')
self.assertIn('display:none', first_child.get('style'),
"the preview node should be hidden")
self.assertEqual(first_child.text.strip(), "Preview " + record.name,
"the preview node should contain the preview text")
# Test if bad inline_template in the subject raises an error
mailing.write({'subject': 'Subject {{ object.name_id.id }}'})
with self.mock_mail_gateway(), self.assertRaises(Exception):
mailing_test.send_mail_test()
# Test if bad inline_template in the body raises an error
mailing.write({
'subject': 'Subject {{ object.name }}',
'body_html': '<p>Hello <t t-out="object.name_id.id"/></p>',
})
with self.mock_mail_gateway(), self.assertRaises(Exception):
mailing_test.send_mail_test()
# Test if bad inline_template in the preview raises an error
mailing.write({
'body_html': '<p>Hello <t t-out="object.name"/></p>',
'preview': 'Preview {{ object.name_id.id }}',
})
with self.mock_mail_gateway(), self.assertRaises(Exception):
mailing_test.send_mail_test()
@users('user_marketing')
@mute_logger('odoo.addons.mail.models.mail_render_mixin')
def test_mailing_test_button_links(self):
"""This tests that the link provided by the View in Browser snippet is correctly replaced
when sending a test mailing while the Unsubscribe button's link isn't, to preserve the testing route
/unsubscribe_from_list.
This also checks that other links containing the /view route aren't replaced along the way.
"""
mailing = self.test_mailing_bl.with_env(self.env)
mailing_test = self.env['mailing.mailing.test'].create({
'email_to': 'test@test.com',
'mass_mailing_id': mailing.id,
})
# Test if link snippets are correctly converted
mailing.write({
'body_html':
'''<p>
Hello <a href="http://www.example.com/view">World<a/>
<div class="o_snippet_view_in_browser o_mail_snippet_general pt16 pb16" style="text-align: center; padding-left: 15px; padding-right: 15px;">
<a href="/view">
View Online
</a>
</div>
<div class="o_mail_footer_links">
<a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
</div>
</p>''',
'preview': 'Preview {{ object.name }}',
'subject': 'Subject {{ object.name }}',
})
with self.mock_mail_gateway():
mailing_test.send_mail_test()
body_html = self._mails.pop()['body']
self.assertIn(f'/mailing/{mailing.id}/view', body_html) # Is replaced
self.assertIn('/unsubscribe_from_list', body_html) # Isn't replaced
self.assertIn('http://www.example.com/view', body_html) # Isn't replaced
def test_mailing_test_equals_reality(self):
""" Check that both test and real emails will format the qweb and inline
placeholders correctly in body and subject. """
mailing = self.test_mailing_bl.with_env(self.env)
mailing.write({
'body_html': '<p>Hello {{ object.name }} <t t-out="object.name"/></p>',
'subject': 'Subject {{ object.name }} <t t-out="object.name"/>',
})
mailing_test = self.env['mailing.mailing.test'].create({
'email_to': 'test@test.com',
'mass_mailing_id': mailing.id,
})
with self.mock_mail_gateway():
mailing_test.send_mail_test()
expected_test_record = self.env[mailing.mailing_model_real].search([], limit=1)
self.assertEqual(expected_test_record, self.test_records[0], 'Should take first found one')
expected_subject = f'Subject {expected_test_record.name} <t t-out="object.name"/>'
expected_body = 'Hello {{ object.name }}' + f' {expected_test_record.name}'
self.assertSentEmail(self.env.user.partner_id, ['test@test.com'],
subject='[TEST] %s' % expected_subject,
body_content=expected_body)
with self.mock_mail_gateway():
# send the mailing
mailing.action_launch()
self.env.ref('mass_mailing.ir_cron_mass_mailing_queue').method_direct_trigger()
self.assertSentEmail(
self.env.user.partner_id,
[expected_test_record.email_from],
subject=expected_subject,
body_content=expected_body,
)
self.assertEqual(
self.env['mailing.mailing.test'].create({
'mass_mailing_id': mailing.id,
}).email_to,
'test@test.com',
"Should use the value of the previous record's email_to as default",
)
|