Files
odoo_source/addons/test_mass_mailing/tests/test_mailing_statistics.py
T
Thibault Delavallée 73672cfc9f [FIX] mass_mailing: fix mail related values of statistics emails
When mailings have no responsible, KPIs emails are broken as there is no
from and to on the mail. This leads to mails being invalid and set in
exception.

Moreover currently author and from / to of those D+1 emails are not coherent
as author is current user (generally odoobot as this is generated through
a cron) while from and to are based on mailing responsible.

In this commit we make statistics emails more coherent
  * when a responsible is set on the mailing: author, from and to are linked
    to the responsible;
  * when there is no responsible, current user is set as it may be sent by
    regular people;
  * reply-to is set to company email as it is often the case with 'marketing'
    emails;

Task-2686586 (Repair mailing statistics email)

X-original-commit: 95a21ca16f560cf4341c547f6bc909d3261acd1b
Part-of: odoo/odoo#79877
2021-11-16 16:58:36 +00:00

100 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from lxml import html
from odoo.addons.mail.tests.common import mail_new_test_user
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.common import users
from odoo.tests import tagged
from odoo.tools import mute_logger
@tagged('digest')
class TestMailingStatistics(TestMassMailCommon):
@classmethod
def setUpClass(cls):
super(TestMailingStatistics, cls).setUpClass()
cls.user_marketing_2 = mail_new_test_user(
cls.env,
groups='base.group_user,base.group_partner_manager,mass_mailing.group_mass_mailing_user',
login='user_marketing_2',
name='Marie Marketing',
signature='--\nMarie'
)
@users('user_marketing')
@mute_logger('odoo.addons.mass_mailing.models.mailing', 'odoo.addons.mail.models.mail_mail', 'odoo.addons.mail.models.mail_thread')
def test_mailing_statistics(self):
target_records = self._create_mailing_test_records(model='mailing.test.blacklist', count=10)
mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids)
mailing.write({'mailing_domain': [('id', 'in', target_records.ids)], 'user_id': self.user_marketing_2.id})
mailing.action_put_in_queue()
with self.mock_mail_gateway(mail_unlink_sent=False):
mailing.action_send_mail()
# simulate some replies and clicks
self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, target_records[0], use_in_reply_to=True)
self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, target_records[1], use_in_reply_to=True)
self.gateway_mail_reply_wrecord(MAIL_TEMPLATE, target_records[2], use_in_reply_to=True)
self.gateway_mail_click(mailing, target_records[0], 'https://www.odoo.be')
self.gateway_mail_click(mailing, target_records[2], 'https://www.odoo.be')
self.gateway_mail_click(mailing, target_records[3], 'https://www.odoo.be')
# check mailing statistics
self.assertEqual(mailing.clicked, 3)
self.assertEqual(mailing.delivered, 10)
self.assertEqual(mailing.opened, 4)
self.assertEqual(mailing.opened_ratio, 40)
self.assertEqual(mailing.replied, 3)
self.assertEqual(mailing.replied_ratio, 30)
self.assertEqual(mailing.sent, 10)
with self.mock_mail_gateway(mail_unlink_sent=True):
mailing._action_send_statistics()
self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics")
mail = self._new_mails[0]
# test email values
self.assertEqual(mail.author_id, self.user_marketing_2.partner_id)
self.assertEqual(mail.email_from, self.user_marketing_2.email_formatted)
self.assertEqual(mail.email_to, self.user_marketing_2.email_formatted)
self.assertEqual(mail.reply_to, self.company_admin.partner_id.email_formatted)
self.assertEqual(mail.state, 'outgoing')
# test body content: KPIs
body_html = html.fromstring(mail.body_html)
kpi_values = body_html.xpath('//div[@data-field="mail"]//*[hasclass("kpi_value")]/text()')
self.assertEqual(
[t.strip().strip('%') for t in kpi_values],
['100', str(mailing.opened_ratio), str(mailing.replied_ratio)]
)
# test body content: clicks (a bit hackish but hey we are in stable)
kpi_click_values = body_html.xpath('//div[hasclass("global_layout")]/table//tr[contains(@style,"color: #888888")]/td[contains(@style,"width: 30%")]/text()')
first_link_value = int(kpi_click_values[0].strip().split()[1].strip('()'))
self.assertEqual(first_link_value, mailing.clicked)
@users('user_marketing')
@mute_logger('odoo.addons.mass_mailing.models.mailing', 'odoo.addons.mail.models.mail_mail', 'odoo.addons.mail.models.mail_thread')
def test_mailing_statistics_wo_user(self):
target_records = self._create_mailing_test_records(model='mailing.test.blacklist', count=10)
mailing = self.env['mailing.mailing'].browse(self.mailing_bl.ids)
mailing.write({'mailing_domain': [('id', 'in', target_records.ids)], 'user_id': False})
mailing.action_put_in_queue()
with self.mock_mail_gateway(mail_unlink_sent=False):
mailing.action_send_mail()
with self.mock_mail_gateway(mail_unlink_sent=False):
mailing._action_send_statistics()
self.assertEqual(len(self._new_mails), 1, "Mailing: a mail should have been created for statistics")
mail = self._new_mails[0]
# test email values
self.assertEqual(mail.author_id, self.user_marketing.partner_id)
self.assertEqual(mail.email_from, self.user_marketing.email_formatted)
self.assertEqual(mail.email_to, self.user_marketing.email_formatted)
self.assertEqual(mail.reply_to, self.company_admin.partner_id.email_formatted)
self.assertEqual(mail.state, 'outgoing')