diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index 86a77f76490..cbb10faee51 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -609,7 +609,7 @@ class MassMailing(models.Model): ]) failed_mails.mapped('mailing_trace_ids').unlink() failed_mails.unlink() - self.write({'state': 'in_queue'}) + self.action_put_in_queue() def action_view_traces_scheduled(self): return self._action_view_traces_filtered('scheduled') diff --git a/addons/mass_mailing/tests/__init__.py b/addons/mass_mailing/tests/__init__.py index c9c429232c7..1278b24de27 100644 --- a/addons/mass_mailing/tests/__init__.py +++ b/addons/mass_mailing/tests/__init__.py @@ -9,3 +9,4 @@ from . import test_mailing_controllers from . import test_mailing_mailing_schedule_date from . import test_mailing_ui from . import test_utm +from . import test_mailing_retry diff --git a/addons/mass_mailing/tests/test_mailing_retry.py b/addons/mass_mailing/tests/test_mailing_retry.py new file mode 100644 index 00000000000..01b3d61c654 --- /dev/null +++ b/addons/mass_mailing/tests/test_mailing_retry.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.mass_mailing.tests.common import MassMailCommon +from odoo.addons.base.tests.test_ir_cron import CronMixinCase +from odoo.tests.common import users + +from unittest.mock import patch + +class TestMailingRetry(MassMailCommon, CronMixinCase): + + @classmethod + def setUpClass(cls): + super(TestMailingRetry, cls).setUpClass() + cls._create_mailing_list() + + @users('user_marketing') + def test_mailing_retry_immediate_trigger(self): + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestMailing', + 'subject': 'Test', + 'mailing_type': 'mail', + 'body_html': '
Hello
', + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + 'contact_list_ids': [(4, self.mailing_list_1.id)], + }) + mailing.action_launch() + + # force email sending to fail to test our retry mechanism + def patched_mail_mail_send(mail_records, auto_commit=False, raise_exception=False, smtp_session=None): + mail_records.write({'state': 'exception', 'failure_reason': 'forced_failure'}) + + with patch('odoo.addons.mail.models.mail_mail.MailMail._send', patched_mail_mail_send): + self.env.ref('mass_mailing.ir_cron_mass_mailing_queue').sudo().method_direct_trigger() + + with self.capture_triggers('mass_mailing.ir_cron_mass_mailing_queue') as captured_triggers: + mailing.action_retry_failed() + + self.assertEqual(len(captured_triggers.records), 1, "Should have created an additional trigger immediately") + captured_trigger = captured_triggers.records[0] + self.assertEqual(captured_trigger.cron_id, self.env.ref('mass_mailing.ir_cron_mass_mailing_queue')) diff --git a/addons/mass_mailing_sms/models/mailing_mailing.py b/addons/mass_mailing_sms/models/mailing_mailing.py index e1468bd5365..80b31b961d0 100644 --- a/addons/mass_mailing_sms/models/mailing_mailing.py +++ b/addons/mass_mailing_sms/models/mailing_mailing.py @@ -120,7 +120,7 @@ class Mailing(models.Model): ]) failed_sms.mapped('mailing_trace_ids').unlink() failed_sms.unlink() - self.write({'state': 'in_queue'}) + self.action_put_in_queue() def action_test(self): if self.mailing_type == 'sms': diff --git a/addons/mass_mailing_sms/tests/__init__.py b/addons/mass_mailing_sms/tests/__init__.py index 56c4c9c54f6..d5339f146a7 100644 --- a/addons/mass_mailing_sms/tests/__init__.py +++ b/addons/mass_mailing_sms/tests/__init__.py @@ -3,3 +3,4 @@ from . import common from . import test_mailing_internals +from . import test_mailing_retry diff --git a/addons/mass_mailing_sms/tests/test_mailing_retry.py b/addons/mass_mailing_sms/tests/test_mailing_retry.py new file mode 100644 index 00000000000..bee456df33a --- /dev/null +++ b/addons/mass_mailing_sms/tests/test_mailing_retry.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.mass_mailing_sms.tests.common import MassSMSCommon +from odoo.addons.base.tests.test_ir_cron import CronMixinCase +from odoo.tests.common import users + +from unittest.mock import patch + +class TestMailingRetrySMS(MassSMSCommon, CronMixinCase): + + @classmethod + def setUpClass(cls): + super(TestMailingRetrySMS, cls).setUpClass() + cls._create_mailing_list() + + @users('user_marketing') + def test_sms_retry_immediate_trigger(self): + mailing = self.env['mailing.mailing'].create({ + 'name': 'TestMailing', + 'subject': 'Test', + 'mailing_type': 'sms', + 'body_plaintext': 'Coucou hibou', + 'mailing_model_id': self.env['ir.model']._get('res.partner').id, + 'contact_list_ids': [(4, self.mailing_list_1.id)], + }) + mailing.action_send_sms() + + # force the SMS sending to fail to test our retry mechanism + def patched_sms_sms_send(sms_records, unlink_failed=False, unlink_sent=True, raise_exception=False): + sms_records.write({'state': 'error', 'failure_type':'sms_credit'}) + + with patch('odoo.addons.sms.models.sms_sms.SmsSms._send', patched_sms_sms_send): + self.env.ref('sms.ir_cron_sms_scheduler_action').sudo().method_direct_trigger() + + with self.capture_triggers('mass_mailing.ir_cron_mass_mailing_queue') as captured_triggers: + mailing.action_retry_failed() + + self.assertEqual(len(captured_triggers.records), 1, "Should have created an additional trigger immediately") + captured_trigger = captured_triggers.records[0] + self.assertEqual(captured_trigger.cron_id, self.env.ref('mass_mailing.ir_cron_mass_mailing_queue'))