Improve link tracker tests :
* add missing test for trace tracking in mass mailing. We generate a trace
and find a short link in it, in order to test the tracking in mass
mailing;
* add tests for side effects of mass mailing routes: update of trace status,
clicks, ...
* wrap base url locally instead of globally in MockTracker class to ease
specific setup in classes;
Prepares Task-2150462 (Mass Mailing: Unsubscribe flow improvement)
closes odoo/odoo#94660
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
142 lines
7.0 KiB
Python
142 lines
7.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from odoo.addons.mass_mailing.tests.common import MassMailCommon
|
|
from odoo.tests import users, tagged
|
|
from odoo.tools import mute_logger
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestMailingABTesting(MassMailCommon):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.mailing_list = self._create_mailing_list_of_x_contacts(150)
|
|
self.ab_testing_mailing_1 = self.env['mailing.mailing'].create({
|
|
'subject': 'A/B Testing V1',
|
|
'contact_list_ids': self.mailing_list.ids,
|
|
'ab_testing_enabled': True,
|
|
'ab_testing_pc': 10,
|
|
'ab_testing_schedule_datetime': datetime.now(),
|
|
})
|
|
self.ab_testing_mailing_2 = self.ab_testing_mailing_1.copy({
|
|
'subject': 'A/B Testing V2',
|
|
'ab_testing_pc': 20,
|
|
})
|
|
self.ab_testing_campaign = self.ab_testing_mailing_1.campaign_id
|
|
self.ab_testing_mailing_ids = self.ab_testing_mailing_1 + self.ab_testing_mailing_2
|
|
self.env.flush_all()
|
|
self.env.invalidate_all()
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
@users('user_marketing')
|
|
def test_mailing_ab_testing_auto_flow(self):
|
|
with self.mock_mail_gateway():
|
|
self.ab_testing_mailing_ids.action_send_mail()
|
|
self.assertEqual(self.ab_testing_mailing_1.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_2.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 0)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 0)
|
|
|
|
total_trace_ids = self.ab_testing_mailing_ids.mailing_trace_ids
|
|
unique_recipients_used = set(map(lambda mail: mail.res_id, total_trace_ids.mail_mail_id))
|
|
self.assertEqual(len(self.ab_testing_mailing_1.mailing_trace_ids), 15)
|
|
self.assertEqual(len(self.ab_testing_mailing_2.mailing_trace_ids), 30)
|
|
self.assertEqual(len(unique_recipients_used), 45)
|
|
|
|
self.ab_testing_mailing_1.mailing_trace_ids[:10].set_opened()
|
|
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
|
|
|
|
with self.mock_mail_gateway():
|
|
self.ab_testing_mailing_2.action_send_winner_mailing()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
winner_mailing = self.ab_testing_campaign.mailing_mail_ids.filtered(lambda mailing: mailing.ab_testing_pc == 100)
|
|
self.assertEqual(winner_mailing.subject, 'A/B Testing V1')
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
@users('user_marketing')
|
|
def test_mailing_ab_testing_auto_flow_cron(self):
|
|
self.ab_testing_mailing_1.write({
|
|
'ab_testing_schedule_datetime': datetime.now() + timedelta(days=-1),
|
|
})
|
|
with self.mock_mail_gateway():
|
|
self.ab_testing_mailing_ids.action_send_mail()
|
|
self.assertEqual(self.ab_testing_mailing_1.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_2.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 0)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 0)
|
|
|
|
total_trace_ids = self.ab_testing_mailing_ids.mailing_trace_ids
|
|
unique_recipients_used = set(map(lambda mail: mail.res_id, total_trace_ids.mail_mail_id))
|
|
self.assertEqual(len(self.ab_testing_mailing_1.mailing_trace_ids), 15)
|
|
self.assertEqual(len(self.ab_testing_mailing_2.mailing_trace_ids), 30)
|
|
self.assertEqual(len(unique_recipients_used), 45)
|
|
|
|
self.ab_testing_mailing_1.mailing_trace_ids[:10].set_opened()
|
|
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
|
|
|
|
with self.mock_mail_gateway():
|
|
self.env.ref('mass_mailing.ir_cron_mass_mailing_ab_testing').sudo().method_direct_trigger()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
winner_mailing = self.ab_testing_campaign.mailing_mail_ids.filtered(lambda mailing: mailing.ab_testing_pc == 100)
|
|
self.assertEqual(winner_mailing.subject, 'A/B Testing V1')
|
|
|
|
@users('user_marketing')
|
|
def test_mailing_ab_testing_campaign(self):
|
|
schedule_datetime = datetime.now() + timedelta(days=30)
|
|
ab_mailing = self.env['mailing.mailing'].create({
|
|
'subject': 'A/B Testing V1',
|
|
'contact_list_ids': self.mailing_list.ids,
|
|
'ab_testing_enabled': True,
|
|
'ab_testing_winner_selection': 'manual',
|
|
'ab_testing_schedule_datetime': schedule_datetime,
|
|
})
|
|
ab_mailing.invalidate_recordset()
|
|
|
|
# Check if the campaign is correclty created and the values set on the mailing are still the same
|
|
self.assertTrue(ab_mailing.campaign_id, "A campaign id is present for the A/B test mailing")
|
|
self.assertEqual(ab_mailing.ab_testing_winner_selection, 'manual', "The selection winner has been propagated correctly")
|
|
self.assertEqual(ab_mailing.ab_testing_schedule_datetime, schedule_datetime, "The schedule date has been propagated correctly")
|
|
|
|
@mute_logger('odoo.addons.mail.models.mail_mail')
|
|
@users('user_marketing')
|
|
def test_mailing_ab_testing_manual_flow(self):
|
|
self.ab_testing_mailing_1.write({
|
|
'ab_testing_winner_selection': 'manual',
|
|
})
|
|
with self.mock_mail_gateway():
|
|
self.ab_testing_mailing_ids.action_send_mail()
|
|
self.assertEqual(self.ab_testing_mailing_1.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_2.state, 'done')
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 0)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 0)
|
|
|
|
total_trace_ids = self.ab_testing_mailing_ids.mailing_trace_ids
|
|
unique_recipients_used = set(map(lambda mail: mail.res_id, total_trace_ids.mail_mail_id))
|
|
self.assertEqual(len(self.ab_testing_mailing_1.mailing_trace_ids), 15)
|
|
self.assertEqual(len(self.ab_testing_mailing_2.mailing_trace_ids), 30)
|
|
self.assertEqual(len(unique_recipients_used), 45)
|
|
|
|
self.ab_testing_mailing_1.mailing_trace_ids[:10].set_opened()
|
|
self.ab_testing_mailing_2.mailing_trace_ids[:15].set_opened()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
|
|
self.assertEqual(self.ab_testing_mailing_1.opened_ratio, 66)
|
|
self.assertEqual(self.ab_testing_mailing_2.opened_ratio, 50)
|
|
|
|
with self.mock_mail_gateway():
|
|
self.ab_testing_mailing_2.action_send_winner_mailing()
|
|
self.ab_testing_mailing_ids.invalidate_recordset()
|
|
winner_mailing = self.ab_testing_campaign.mailing_mail_ids.filtered(lambda mailing: mailing.ab_testing_pc == 100)
|
|
self.assertEqual(winner_mailing.subject, 'A/B Testing V2')
|