diff options
| author | Thibault Delavallée <tde@odoo.com> | 2021-04-26 08:49:21 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2021-04-27 09:15:43 +0000 |
| commit | 4cf75bb1767fe7524c8e4d895d84ad2b56ef404d (patch) | |
| tree | 199ee28b117b134cc6e23cd10582a53af298197d | |
| parent | 733411fe03b924832d6b10cadf93c8fc09cc5802 (diff) | |
[IMP] test_mass_mailing: improve test data management and test users, merge mailing tests
In this commit we try to simplify tests organization by
* merging mailing_internals and mass_mailing tests, as they globally handle
mailing-related tests (blacklist, opt-out, gateway update through replies
and clicks);
* move wizard (mailing.test) tests in their own file as they target a
specific model;
* add some loggers to reduce noise;
* add some users wrappers to test using real users;
Backport of odoo/odoo@230b8258a551010080dd582923afe5a2f91d644b done in master (14.4)
LINKS
Task ID-2117639
COM PR odoo/odoo#40931
| -rw-r--r-- | addons/test_mass_mailing/tests/__init__.py | 4 | ||||
| -rw-r--r-- | addons/test_mass_mailing/tests/common.py | 8 | ||||
| -rw-r--r-- | addons/test_mass_mailing/tests/test_mailing.py (renamed from addons/test_mass_mailing/tests/test_mass_mailing.py) | 103 | ||||
| -rw-r--r-- | addons/test_mass_mailing/tests/test_mailing_internals.py | 163 | ||||
| -rw-r--r-- | addons/test_mass_mailing/tests/test_mailing_test.py | 50 |
5 files changed, 163 insertions, 165 deletions
diff --git a/addons/test_mass_mailing/tests/__init__.py b/addons/test_mass_mailing/tests/__init__.py index 2391896e3e4..978ceb47d01 100644 --- a/addons/test_mass_mailing/tests/__init__.py +++ b/addons/test_mass_mailing/tests/__init__.py @@ -5,6 +5,6 @@ from . import test_blacklist from . import test_blacklist_behavior from . import test_blacklist_mixin from . import test_link_tracker -from . import test_mailing_internals -from . import test_mass_mailing +from . import test_mailing_test +from . import test_mailing from . import test_performance diff --git a/addons/test_mass_mailing/tests/common.py b/addons/test_mass_mailing/tests/common.py index 43b1ad27ea1..ff368bf59be 100644 --- a/addons/test_mass_mailing/tests/common.py +++ b/addons/test_mass_mailing/tests/common.py @@ -11,6 +11,13 @@ class TestMassMailCommon(MassMailCommon, TestMailCommon): def setUpClass(cls): super(TestMassMailCommon, cls).setUpClass() + cls.test_alias = cls.env['mail.alias'].create({ + 'alias_name': 'test.alias', + 'alias_user_id': False, + 'alias_model_id': cls.env['ir.model']._get('mailing.test.simple').id, + 'alias_contact': 'everyone' + }) + # enforce last update by user_marketing to match _process_mass_mailing_queue # taking last writer as user running a batch cls.mailing_bl = cls.env['mailing.mailing'].with_user(cls.user_marketing).create({ @@ -32,6 +39,7 @@ class TestMassMailCommon(MassMailCommon, TestMailCommon): </div>""", 'mailing_type': 'mail', 'mailing_model_id': cls.env['ir.model']._get('mailing.test.blacklist').id, + 'reply_to_mode': 'thread', }) @classmethod diff --git a/addons/test_mass_mailing/tests/test_mass_mailing.py b/addons/test_mass_mailing/tests/test_mailing.py index 0a2f45f0e17..4179327de94 100644 --- a/addons/test_mass_mailing/tests/test_mass_mailing.py +++ b/addons/test_mass_mailing/tests/test_mailing.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.addons.test_mass_mailing.data.mail_test_data import MAIL_TEMPLATE from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon from odoo.tests import tagged from odoo.tests.common import users @@ -15,6 +16,62 @@ class TestMassMailing(TestMassMailCommon): super(TestMassMailing, cls).setUpClass() @users('user_marketing') + @mute_logger('odoo.addons.mail.models.mail_thread') + def test_mailing_gateway_reply(self): + customers = self.env['res.partner'] + for x in range(0, 3): + customers |= self.env['res.partner'].create({ + 'name': 'Customer_%02d' % x, + 'email': '"Customer_%02d" <customer_%02d@test.example.com' % (x, x), + }) + + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestName', + 'subject': 'TestSubject', + 'body_html': 'Hello ${object.name}', + 'reply_to_mode': 'email', + 'reply_to': '%s@%s' % (self.test_alias.alias_name, self.test_alias.alias_domain), + 'keep_archives': True, + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + 'mailing_domain': '%s' % [('id', 'in', customers.ids)], + }) + mailing.action_put_in_queue() + with self.mock_mail_gateway(mail_unlink_sent=False): + mailing.action_send_mail() + + self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, customers[0], use_in_reply_to=True) + self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, customers[1], use_in_reply_to=False) + + # customer2 looses headers + mail_mail = self._find_mail_mail_wrecord(customers[2]) + self.format_and_process( + MAIL_TEMPLATE, + mail_mail.email_to, + mail_mail.reply_to, + subject='Re: %s' % mail_mail.subject, + extra='', + msg_id='<123456.%s.%d@test.example.com>' % (customers[2]._name, customers[2].id), + target_model=customers[2]._name, target_field=customers[2]._rec_name, + ) + mailing.flush() + + # check traces status + traces = self.env['mailing.trace'].search([('model', '=', customers._name), ('res_id', 'in', customers.ids)]) + self.assertEqual(len(traces), 3) + customer0_trace = traces.filtered(lambda t: t.res_id == customers[0].id) + self.assertEqual(customer0_trace.state, 'replied') + customer1_trace = traces.filtered(lambda t: t.res_id == customers[1].id) + self.assertEqual(customer1_trace.state, 'replied') + customer2_trace = traces.filtered(lambda t: t.res_id == customers[2].id) + self.assertEqual(customer2_trace.state, 'sent') + + # check mailing statistics + self.assertEqual(mailing.sent, 3) + self.assertEqual(mailing.delivered, 3) + self.assertEqual(mailing.opened, 2) + self.assertEqual(mailing.replied, 2) + + @users('user_marketing') @mute_logger('odoo.addons.mail.models.mail_mail') def test_mailing_gateway_update(self): mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids) @@ -63,6 +120,52 @@ class TestMassMailing(TestMassMailCommon): self.assertEqual(recipients[1].message_bounce, 1) @users('user_marketing') + @mute_logger('odoo.addons.mail.models.mail_thread') + def test_mailing_trace_utm(self): + """ Test mailing UTMs are caught on reply""" + self._create_mailing_list() + self.test_alias.write({ + 'alias_model_id': self.env['ir.model']._get('mailing.test.utm').id + }) + + source = self.env['utm.source'].create({'name': 'Source test'}) + medium = self.env['utm.medium'].create({'name': 'Medium test'}) + campaign = self.env['utm.campaign'].create({'name': 'Campaign test'}) + subject = 'MassMailingTestUTM' + + mailing = self.env['mailing.mailing'].create({ + 'name': 'UTMTest', + 'subject': subject, + 'body_html': '<p>Hello ${object.name}</p>', + 'reply_to_mode': 'email', + 'reply_to': '%s@%s' % (self.test_alias.alias_name, self.test_alias.alias_domain), + 'keep_archives': True, + 'mailing_model_id': self.env['ir.model']._get('mailing.list').id, + 'contact_list_ids': [(4, self.mailing_list_1.id)], + 'source_id': source.id, + 'medium_id': medium.id, + 'campaign_id': campaign.id + }) + + mailing.action_put_in_queue() + with self.mock_mail_gateway(mail_unlink_sent=False): + mailing._process_mass_mailing_queue() + + traces = self.env['mailing.trace'].search([('model', '=', self.mailing_list_1.contact_ids._name), ('res_id', 'in', self.mailing_list_1.contact_ids.ids)]) + self.assertEqual(len(traces), 3) + + # simulate response to mailing + self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, self.mailing_list_1.contact_ids[0], use_in_reply_to=True) + self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, self.mailing_list_1.contact_ids[1], use_in_reply_to=False) + + mailing_test_utms = self.env['mailing.test.utm'].search([('name', '=', 'Re: %s' % subject)]) + self.assertEqual(len(mailing_test_utms), 2) + for test_utm in mailing_test_utms: + self.assertEqual(test_utm.campaign_id, campaign) + self.assertEqual(test_utm.source_id, source) + self.assertEqual(test_utm.medium_id, medium) + + @users('user_marketing') @mute_logger('odoo.addons.mail.models.mail_mail') def test_mailing_w_blacklist(self): mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids) diff --git a/addons/test_mass_mailing/tests/test_mailing_internals.py b/addons/test_mass_mailing/tests/test_mailing_internals.py deleted file mode 100644 index 555578e492d..00000000000 --- a/addons/test_mass_mailing/tests/test_mailing_internals.py +++ /dev/null @@ -1,163 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon -from odoo.addons.test_mass_mailing.data.mail_test_data import MAIL_TEMPLATE -from odoo.tests.common import users -from odoo.tools import mute_logger - - -class TestMailingInternals(TestMassMailCommon): - - def setUp(self): - super(TestMailingInternals, self).setUp() - - self.env['ir.config_parameter'].set_param('mail.bounce.alias', 'bounce.test') - self.env['ir.config_parameter'].set_param('mail.catchall.alias', 'catchall.test') - self.env['ir.config_parameter'].set_param('mail.catchall.domain', 'test.example.com') - - self.test_alias = self.env['mail.alias'].create({ - 'alias_name': 'test.alias', - 'alias_user_id': False, - 'alias_model_id': self.env['ir.model']._get('mailing.test.simple').id, - 'alias_contact': 'everyone' - }) - - @mute_logger('odoo.addons.mail.models.mail_render_mixin') - def test_mailing_test_button(self): - mailing = self.env['mailing.mailing'].create({ - 'name': 'TestButton', - 'subject': 'Subject ${object.name}', - 'preview': 'Preview ${object.name}', - 'state': 'draft', - 'mailing_type': 'mail', - 'body_html': '<p>Hello ${object.name}</p>', - 'mailing_model_id': self.env['ir.model']._get('res.partner').id, - }) - 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() - - # Test if bad jinja 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 jinja in the body raises an error - mailing.write({ - 'subject': 'Subject ${object.name}', - 'body_html': '<p>Hello ${object.name_id.id}</p>', - }) - with self.mock_mail_gateway(), self.assertRaises(Exception): - mailing_test.send_mail_test() - - # Test if bad jinja in the preview raises an error - mailing.write({ - 'body_html': '<p>Hello ${object.name}</p>', - 'preview': 'Preview ${object.name_id.id}', - }) - with self.mock_mail_gateway(), self.assertRaises(Exception): - mailing_test.send_mail_test() - - def test_mailing_trace_update(self): - customers = self.env['res.partner'] - for x in range(0, 3): - customers |= self.env['res.partner'].create({ - 'name': 'Customer_%02d' % x, - 'email': '"Customer_%02d" <customer_%02d@test.example.com' % (x, x), - }) - - mailing = self.env['mailing.mailing'].create({ - 'name': 'TestName', - 'subject': 'TestSubject', - 'body_html': 'Hello ${object.name}', - 'reply_to_mode': 'email', - 'reply_to': '%s@%s' % (self.test_alias.alias_name, self.test_alias.alias_domain), - 'keep_archives': True, - 'mailing_model_id': self.env['ir.model']._get('res.partner').id, - 'mailing_domain': '%s' % [('id', 'in', customers.ids)], - }) - mailing.action_put_in_queue() - with self.mock_mail_gateway(mail_unlink_sent=False): - mailing.action_send_mail() - - self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, customers[0], use_in_reply_to=True) - self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, customers[1], use_in_reply_to=False) - - # customer2 looses headers - mail_mail = self._find_mail_mail_wrecord(customers[2]) - self.format_and_process( - MAIL_TEMPLATE, - mail_mail.email_to, - mail_mail.reply_to, - subject='Re: %s' % mail_mail.subject, - extra='', - msg_id='<123456.%s.%d@test.example.com>' % (customers[2]._name, customers[2].id), - target_model=customers[2]._name, target_field=customers[2]._rec_name, - ) - mailing.flush() - - # check traces status - traces = self.env['mailing.trace'].search([('model', '=', customers._name), ('res_id', 'in', customers.ids)]) - self.assertEqual(len(traces), 3) - customer0_trace = traces.filtered(lambda t: t.res_id == customers[0].id) - self.assertEqual(customer0_trace.state, 'replied') - customer1_trace = traces.filtered(lambda t: t.res_id == customers[1].id) - self.assertEqual(customer1_trace.state, 'replied') - customer2_trace = traces.filtered(lambda t: t.res_id == customers[2].id) - self.assertEqual(customer2_trace.state, 'sent') - - # check mailing statistics - self.assertEqual(mailing.sent, 3) - self.assertEqual(mailing.delivered, 3) - self.assertEqual(mailing.opened, 2) - self.assertEqual(mailing.replied, 2) - - @users('user_marketing') - def test_mailing_trace_utm(self): - """ Test mailing UTMs are caught on reply""" - self._create_mailing_list() - self.test_alias.write({ - 'alias_model_id': self.env['ir.model']._get('mailing.test.utm').id - }) - - source = self.env['utm.source'].create({'name': 'Source test'}) - medium = self.env['utm.medium'].create({'name': 'Medium test'}) - campaign = self.env['utm.campaign'].create({'name': 'Campaign test'}) - subject = 'MassMailingTestUTM' - - mailing = self.env['mailing.mailing'].create({ - 'name': 'UTMTest', - 'subject': subject, - 'body_html': '<p>Hello ${object.name}</p>', - 'reply_to_mode': 'email', - 'reply_to': '%s@%s' % (self.test_alias.alias_name, self.test_alias.alias_domain), - 'keep_archives': True, - 'mailing_model_id': self.env['ir.model']._get('mailing.list').id, - 'contact_list_ids': [(4, self.mailing_list_1.id)], - 'source_id': source.id, - 'medium_id': medium.id, - 'campaign_id': campaign.id - }) - - mailing.action_put_in_queue() - with self.mock_mail_gateway(mail_unlink_sent=False): - mailing._process_mass_mailing_queue() - - traces = self.env['mailing.trace'].search([('model', '=', self.mailing_list_1.contact_ids._name), ('res_id', 'in', self.mailing_list_1.contact_ids.ids)]) - self.assertEqual(len(traces), 3) - - # simulate response to mailing - self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, self.mailing_list_1.contact_ids[0], use_in_reply_to=True) - self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, self.mailing_list_1.contact_ids[1], use_in_reply_to=False) - - mailing_test_utms = self.env['mailing.test.utm'].search([('name', '=', 'Re: %s' % subject)]) - self.assertEqual(len(mailing_test_utms), 2) - for test_utm in mailing_test_utms: - self.assertEqual(test_utm.campaign_id, campaign) - self.assertEqual(test_utm.source_id, source) - self.assertEqual(test_utm.medium_id, medium) diff --git a/addons/test_mass_mailing/tests/test_mailing_test.py b/addons/test_mass_mailing/tests/test_mailing_test.py new file mode 100644 index 00000000000..33c0419af07 --- /dev/null +++ b/addons/test_mass_mailing/tests/test_mailing_test.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.test_mass_mailing.tests.common import TestMassMailCommon +from odoo.tests.common import users +from odoo.tools import mute_logger + + +class TestMailingTest(TestMassMailCommon): + + @users('user_marketing') + @mute_logger('odoo.addons.mail.models.mail_render_mixin') + def test_mailing_test_button(self): + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestButton', + 'subject': 'Subject ${object.name}', + 'preview': 'Preview ${object.name}', + 'state': 'draft', + 'mailing_type': 'mail', + 'body_html': '<p>Hello ${object.name}</p>', + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + }) + 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() + + # Test if bad jinja 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 jinja in the body raises an error + mailing.write({ + 'subject': 'Subject ${object.name}', + 'body_html': '<p>Hello ${object.name_id.id}</p>', + }) + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.send_mail_test() + + # Test if bad jinja in the preview raises an error + mailing.write({ + 'body_html': '<p>Hello ${object.name}</p>', + 'preview': 'Preview ${object.name_id.id}', + }) + with self.mock_mail_gateway(), self.assertRaises(Exception): + mailing_test.send_mail_test() |
