Files
enterprise-addons/test_marketing_automation/tests/test_ma_internals.py
T

180 lines
8.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.test_marketing_automation.tests.common import TestMACommon
from odoo.tests import tagged, users
from odoo.tools import mute_logger
from odoo.fields import Datetime
@tagged('marketing_automation')
class MarketingCampaignTest(TestMACommon):
@classmethod
def setUpClass(cls):
super(MarketingCampaignTest, cls).setUpClass()
cls.date_reference = Datetime.from_string('2023-11-08 08:00:00')
cls.test_records = cls._create_marketauto_records(model='marketing.test.sms', count=2)
cls.env['res.lang']._activate_lang('fr_FR')
@users('user_marketing_automation')
@mute_logger('odoo.addons.base.ir.ir_model', 'odoo.models')
def test_campaign_archive(self):
""" Ensures that campaigns are stopped when archived. """
campaign = self.env['marketing.campaign'].create({
'domain': [('id', 'in', self.test_records[0].ids)],
'model_id': self.env['ir.model']._get_id('marketing.test.sms'),
'name': 'Test Campaign',
})
self._create_activity_mail(campaign, act_values={'interval_number': 0})
self._launch_campaign(campaign)
self.assertEqual(campaign.state, 'running')
campaign.active = False
self.assertEqual(campaign.state, 'stopped')
@users('user_marketing_automation')
@mute_logger('odoo.addons.base.models.ir_model', 'odoo.addons.mail.models.mail_mail')
def test_campaign_domain_with_translated_terms(self):
""" Test that a campaign with a domain containing translated terms in
the language of the responsible does correctly sync participant and
execute activities. """
# init test variables to ease code reading
test_records = self.test_records.with_env(self.env)
test_records_init = test_records.filtered(lambda r: r.name != 'Test_00')
test_records.write({'text_trans': 'Test EN'})
test_records.with_context(lang="fr_FR").write({'text_trans': 'Test FR'})
self.env.user.sudo().write({'lang': 'en_US'})
campaign = self.env['marketing.campaign'].create({
'domain': [('name', '!=', 'Test_00'), ('text_trans', '=', 'Test FR')],
'marketing_activity_ids': [
(0, 0, {
'activity_type': 'email',
'name': 'Test',
}),
],
'model_id': self.env['ir.model']._get_id('marketing.test.sms'),
'name': 'Test Campaign',
})
# launch campaign, with responsible language != language terms in campaign domain
self._launch_campaign(campaign, date_reference=self.date_reference)
self.assertEqual(campaign.running_participant_count, 0)
self.assertFalse(campaign.participant_ids)
# with responsible language == language terms in campaign domain
self.env.user.sudo().write({'lang': 'fr_FR'})
with self.mock_datetime_and_now(self.date_reference):
campaign.sync_participants()
self.assertEqual(campaign.running_participant_count, len(test_records_init))
self.assertEqual(campaign.participant_ids.mapped('res_id'), test_records_init.ids)
self.assertEqual(set(campaign.participant_ids.mapped('state')), {'running'})
@users('user_marketing_automation')
@mute_logger('odoo.addons.base.ir.ir_model', 'odoo.models')
def test_campaign_duplicate(self):
""" The copy/duplicate of a campaign :
- COPY activities, new activities related to the new campaign
- DO NOT COPY the recipients AND the trace_ids AND the state (draft by default)
- Normal Copy of other fields
- Copy child of activity and keep coherence in parent_id
"""
campaign = self.env['marketing.campaign'].create({
'domain': [('id', 'in', self.test_records.ids)],
'model_id': self.env['ir.model']._get_id('marketing.test.sms'),
'name': 'My First Campaign',
})
mailing = self._create_mailing('marketing.test.sms')
activity = self._create_activity(
campaign,
mailing=mailing,
name="ShouldDuplicate",
)
activity2 = self._create_activity(
campaign,
mailing=mailing,
name="ShouldDuplicate2",
parent_id=activity.id,
trigger_type="mail_open",
)
self.assertEqual(
self.env['marketing.activity'].search([('name', '=', "ShouldDuplicate")]),
activity
)
self._launch_campaign(campaign)
self.assertEqual(campaign.state, 'running')
self.assertEqual(
activity.trace_ids.mapped('participant_id'),
campaign.participant_ids,
)
# copy campaign
campaign2 = campaign.copy()
# check campaign state
self.assertEqual(campaign2.state, 'draft')
self.assertEqual(campaign2.participant_ids, self.env['marketing.participant'])
# activities: Two activities with similar name (one with an counter, the other without) but not related to the same campaign
# see utm.mixin#_get_unique_names
activities = self.env['marketing.activity'].search([('name', 'in', ('ShouldDuplicate', 'ShouldDuplicate [2]'))])
activities2 = self.env['marketing.activity'].search([('name', 'in', ('ShouldDuplicate2', 'ShouldDuplicate2 [2]'))])
activity_dup = campaign2.marketing_activity_ids.filtered(lambda activity: not activity.parent_id)
activity2_dup = campaign2.marketing_activity_ids.filtered(lambda activity: activity.parent_id)
self.assertEqual(activities, activity | activity_dup)
self.assertEqual(activities2, activity2 | activity2_dup)
self.assertEqual(activities.campaign_id, campaign | campaign2)
self.assertEqual(activity_dup.trace_ids, self.env['marketing.trace'])
self.assertEqual(activity2_dup.trace_ids, self.env['marketing.trace'])
self.assertEqual(campaign2.marketing_activity_ids, activity_dup | activity2_dup)
# check relationships
self.assertEqual(activity2.parent_id, activity)
self.assertEqual(activity2_dup.parent_id, activity_dup)
@users('user_marketing_automation')
@mute_logger('odoo.addons.base.ir.ir_model', 'odoo.models')
def test_campaign_participants_compute(self):
"""Check that the participant count compute method works."""
empty_campaign = self.env['marketing.campaign'].create({
'name': 'My First Campaign',
'model_id': self.env['ir.model']._get('marketing.test.sms').id,
})
self.assertEqual(empty_campaign.total_participant_count, 0)
campaign1 = self.env['marketing.campaign'].create({
'name': 'Campaign 1',
'model_id': self.env['ir.model']._get('marketing.test.sms').id,
})
campaign2 = self.env['marketing.campaign'].create({
'name': 'Campaign 2',
'model_id': self.env['ir.model']._get('marketing.test.sms').id,
})
self.env['marketing.participant'].create([
{'campaign_id': campaign1.id, 'state': 'running', 'is_test': True},
{'campaign_id': campaign1.id, 'state': 'running', 'is_test': True},
{'campaign_id': campaign1.id, 'state': 'running', 'is_test': False},
{'campaign_id': campaign1.id, 'state': 'running', 'is_test': False},
{'campaign_id': campaign1.id, 'state': 'completed', 'is_test': True},
{'campaign_id': campaign1.id, 'state': 'completed', 'is_test': False},
{'campaign_id': campaign2.id, 'state': 'running', 'is_test': True},
{'campaign_id': campaign2.id, 'state': 'completed', 'is_test': True},
{'campaign_id': campaign2.id, 'state': 'completed', 'is_test': False},
{'campaign_id': campaign2.id, 'state': 'completed', 'is_test': False},
])
self.assertEqual(campaign1.running_participant_count, 2)
self.assertEqual(campaign1.completed_participant_count, 1)
self.assertEqual(campaign1.total_participant_count, 3)
self.assertEqual(campaign1.test_participant_count, 3)
self.assertEqual(campaign2.running_participant_count, 0)
self.assertEqual(campaign2.completed_participant_count, 2)
self.assertEqual(campaign2.total_participant_count, 2)
self.assertEqual(campaign2.test_participant_count, 2)