From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001
From: stephanchrst
Date: Tue, 10 May 2022 21:51:50 +0700
Subject: initial commit 2
---
addons/test_mass_mailing/tests/test_mailing.py | 340 +++++++++++++++++++++++++
1 file changed, 340 insertions(+)
create mode 100644 addons/test_mass_mailing/tests/test_mailing.py
(limited to 'addons/test_mass_mailing/tests/test_mailing.py')
diff --git a/addons/test_mass_mailing/tests/test_mailing.py b/addons/test_mass_mailing/tests/test_mailing.py
new file mode 100644
index 00000000..4f6fa34f
--- /dev/null
+++ b/addons/test_mass_mailing/tests/test_mailing.py
@@ -0,0 +1,340 @@
+# -*- 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
+from odoo.tools import mute_logger
+
+
+@tagged('mass_mailing')
+class TestMassMailing(TestMassMailCommon):
+
+ @classmethod
+ def setUpClass(cls):
+ 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" 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('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)
+ recipients = self._create_mailing_test_records(count=5)
+
+ # blacklist records 2, 3, 4
+ self.env['mail.blacklist'].create({'email': recipients[2].email_normalized})
+ self.env['mail.blacklist'].create({'email': recipients[3].email_normalized})
+ self.env['mail.blacklist'].create({'email': recipients[4].email_normalized})
+
+ # unblacklist record 2
+ self.env['mail.blacklist'].action_remove_with_reason(
+ recipients[2].email_normalized, "human error"
+ )
+ self.env['mail.blacklist'].flush(['active'])
+
+ mailing.write({'mailing_domain': [('id', 'in', recipients.ids)]})
+ mailing.action_put_in_queue()
+ with self.mock_mail_gateway(mail_unlink_sent=False):
+ mailing._process_mass_mailing_queue()
+
+ self.assertMailTraces(
+ [{'email': 'test.record.00@test.example.com'},
+ {'email': 'test.record.01@test.example.com'},
+ {'email': 'test.record.02@test.example.com'},
+ {'email': 'test.record.03@test.example.com', 'state': 'ignored'},
+ {'email': 'test.record.04@test.example.com', 'state': 'ignored'}],
+ mailing, recipients, check_mail=True
+ )
+ self.assertEqual(mailing.ignored, 2)
+
+ @users('user_marketing')
+ @mute_logger('odoo.addons.mail.models.mail_mail')
+ def test_mailing_w_opt_out(self):
+ mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids)
+ recipients = self._create_mailing_test_records(model='mailing.test.optout', count=5)
+
+ # optout records 0 and 1
+ (recipients[0] | recipients[1]).write({'opt_out': True})
+ # blacklist records 4
+ self.env['mail.blacklist'].create({'email': recipients[4].email_normalized})
+
+ mailing.write({
+ 'mailing_model_id': self.env['ir.model']._get('mailing.test.optout'),
+ 'mailing_domain': [('id', 'in', recipients.ids)]
+ })
+ mailing.action_put_in_queue()
+ with self.mock_mail_gateway(mail_unlink_sent=False):
+ mailing._process_mass_mailing_queue()
+
+ self.assertMailTraces(
+ [{'email': 'test.record.00@test.example.com', 'state': 'ignored'},
+ {'email': 'test.record.01@test.example.com', 'state': 'ignored'},
+ {'email': 'test.record.02@test.example.com'},
+ {'email': 'test.record.03@test.example.com'},
+ {'email': 'test.record.04@test.example.com', 'state': 'ignored'}],
+ mailing, recipients, check_mail=True
+ )
+ self.assertEqual(mailing.ignored, 3)
+
+ @users('user_marketing')
+ @mute_logger('odoo.addons.mail.models.mail_mail')
+ def test_mailing_mailing_list_optout(self):
+ """ Test mailing list model specific optout behavior """
+ mailing_contact_1 = self.env['mailing.contact'].create({'name': 'test 1A', 'email': 'test@test.example.com'})
+ mailing_contact_2 = self.env['mailing.contact'].create({'name': 'test 1B', 'email': 'test@test.example.com'})
+ mailing_contact_3 = self.env['mailing.contact'].create({'name': 'test 3', 'email': 'test3@test.example.com'})
+ mailing_contact_4 = self.env['mailing.contact'].create({'name': 'test 4', 'email': 'test4@test.example.com'})
+ mailing_contact_5 = self.env['mailing.contact'].create({'name': 'test 5', 'email': 'test5@test.example.com'})
+
+ # create mailing list record
+ mailing_list_1 = self.env['mailing.list'].create({
+ 'name': 'A',
+ 'contact_ids': [
+ (4, mailing_contact_1.id),
+ (4, mailing_contact_2.id),
+ (4, mailing_contact_3.id),
+ (4, mailing_contact_5.id),
+ ]
+ })
+ mailing_list_2 = self.env['mailing.list'].create({
+ 'name': 'B',
+ 'contact_ids': [
+ (4, mailing_contact_3.id),
+ (4, mailing_contact_4.id),
+ ]
+ })
+ # contact_1 is optout but same email is not optout from the same list
+ # contact 3 is optout in list 1 but not in list 2
+ # contact 5 is optout
+ Sub = self.env['mailing.contact.subscription']
+ Sub.search([('contact_id', '=', mailing_contact_1.id), ('list_id', '=', mailing_list_1.id)]).write({'opt_out': True})
+ Sub.search([('contact_id', '=', mailing_contact_3.id), ('list_id', '=', mailing_list_1.id)]).write({'opt_out': True})
+ Sub.search([('contact_id', '=', mailing_contact_5.id), ('list_id', '=', mailing_list_1.id)]).write({'opt_out': True})
+
+ # create mass mailing record
+ mailing = self.env['mailing.mailing'].create({
+ 'name': 'SourceName',
+ 'subject': 'MailingSubject',
+ 'body_html': 'Hello ${object.name}
',
+ 'mailing_model_id': self.env['ir.model']._get('mailing.list').id,
+ 'contact_list_ids': [(4, ml.id) for ml in mailing_list_1 | mailing_list_2],
+ })
+ mailing.action_put_in_queue()
+ with self.mock_mail_gateway(mail_unlink_sent=False):
+ mailing._process_mass_mailing_queue()
+
+ self.assertMailTraces(
+ [{'email': 'test@test.example.com', 'state': 'sent'},
+ {'email': 'test@test.example.com', 'state': 'ignored'},
+ {'email': 'test3@test.example.com'},
+ {'email': 'test4@test.example.com'},
+ {'email': 'test5@test.example.com', 'state': 'ignored'}],
+ mailing,
+ mailing_contact_1 + mailing_contact_2 + mailing_contact_3 + mailing_contact_4 + mailing_contact_5,
+ check_mail=True
+ )
+ self.assertEqual(mailing.ignored, 2)
--
cgit v1.2.3