Files

144 lines
6.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from dateutil.relativedelta import relativedelta
from unittest.mock import patch
from odoo.addons.event.tests.common import EventCase
from odoo.addons.mail.tests.common import MockEmail
from odoo.addons.social.tests.tools import mock_void_external_calls
from odoo.exceptions import UserError, ValidationError
from odoo.tests import Form, tagged, users
from odoo.tools import mute_logger
@tagged('event_mail', 'post_install', '-at_install')
class EventSocialCase(EventCase, MockEmail):
@classmethod
def setUpClass(cls):
super().setUpClass()
with mock_void_external_calls():
cls.social_media = cls.env['social.media'].create({
'name': 'Social Media',
})
cls.social_account = cls.env['social.account'].create({
'media_id': cls.social_media.id,
'name': 'Social Account 1',
})
cls.test_social_template = cls.env['social.post.template'].create({
'account_ids': [(4, cls.social_account.id)],
'message': 'Join the Python side of the force!',
})
cls.reference_now = datetime(2021, 3, 20, 14, 30, 15, 123456)
cls.event_date_begin = datetime(2021, 3, 22, 8, 0, 0)
cls.event_date_end = datetime(2021, 3, 24, 18, 0, 0)
with cls.mock_datetime_and_now(cls, cls.reference_now):
cls.test_event = cls.env['event.event'].create({
'name': 'TestEvent',
'date_begin': cls.event_date_begin,
'date_end': cls.event_date_end,
'event_mail_ids': [
(0, 0, { # 1 days before event
'interval_nbr': 1,
'interval_unit': 'days',
'interval_type': 'before_event',
'notification_type': 'social_post',
'template_ref': f'social.post.template,{cls.test_social_template.id}',
}),
],
})
@users('user_eventmanager')
def test_social_schedule_after_sub(self):
"""Check that we can not set "after each registration" with social event mail."""
social_template = self.env['social.post.template'].create({
'account_ids': [(4, self.social_account.id)],
'message': 'Join the Python side of the force!',
})
with self.assertRaises(UserError):
self.env['event.type'].create({
'name': 'Super category',
'event_type_mail_ids': [(0, 0, {
'template_ref': 'social.post.template,%i' % social_template.id,
'interval_type': 'after_sub'
})],
})
with self.assertRaises(UserError):
self.env['event.mail'].create({
'template_ref': 'social.post.template,%i' % social_template.id,
'interval_type': 'after_sub',
'event_id': self.test_event.id,
})
@users('user_eventmanager')
def test_social_schedule_before_event(self):
"""Check that the social template is automatically set, when changing the category of the event."""
social_template = self.env['social.post.template'].create({
'account_ids': [(4, self.social_account.id)],
'message': 'Join the Python side of the force!',
})
category = self.env['event.type'].create({
'name': 'Super category',
'event_type_mail_ids': [(0, 0, {
'notification_type': 'social_post',
'template_ref': 'social.post.template,%i' % social_template.id,
})],
})
event_form = Form(self.env['event.event'])
event_form.name = 'Test event'
event_form.date_begin = '2020-02-01'
event_form.date_end = '2020-02-10'
event_form.event_type_id = category
event = event_form.save()
self.assertEqual(event.name, 'Test event')
self.assertEqual(len(event.event_mail_ids), 1)
self.assertEqual(event.event_mail_ids.interval_type, 'before_event')
self.assertFalse(event.event_mail_ids.mail_done)
self.assertEqual(event.event_mail_ids.scheduled_date, datetime(2020, 1, 31, 23, 0, 0))
self.assertEqual(event.event_mail_ids.template_ref, social_template)
# send scheduler on event
with self.mock_datetime_and_now(datetime(2020, 2, 2, 10, 0, 0)):
# use sudo as schedulers are meant to be run by crons, hence limiting
# ACLs for event users
event.event_mail_ids.sudo().execute()
self.assertEqual(event.event_mail_ids.mail_count_done, 1,
'Should equal number of accounts')
self.assertTrue(event.event_mail_ids.mail_done)
@mute_logger('odoo.addons.event.models.event_mail')
@users('user_eventmanager')
def test_social_schedule_fail_global_composer(self):
""" Simulate a fail during composer usage e.g. invalid field path, template
/ model change, ... to check defensive behavior """
cron = self.env.ref("event.event_mail_scheduler").sudo()
before_scheduler = self.test_event.event_mail_ids
def _patched_action_post(self, *args, **kwargs):
raise ValidationError('Some error')
with (
patch.object(self.env.registry["social.post"], "_action_post", _patched_action_post),
self.mock_datetime_and_now(self.reference_now + relativedelta(days=3)),
self.enter_registry_test_mode(),
):
cron.method_direct_trigger()
self.assertFalse(before_scheduler.mail_done)
@users('user_eventmanager')
def test_social_schedule_fail_global_template_removed(self):
""" Test flow where scheduler fails due to template ref being removed
when sending global event communication (i.e. only through cron). """
self.test_social_template.sudo().unlink()
test_event = self.env['event.event'].browse(self.test_event.ids)
before_scheduler = test_event.event_mail_ids
self.assertFalse(before_scheduler)