# Copyright 2020 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from datetime import datetime from dateutil.relativedelta import relativedelta from freezegun import freeze_time from odoo.tests import common class TestMailActivityReminder(common.SavepointCase): @classmethod def setUpClass(cls): super().setUpClass() cls.env = cls.env(context=dict( cls.env.context, tracking_disable=True, no_reset_password=True, )) cls.ResUsers = cls.env['res.users'] cls.Company = cls.env['res.company'] cls.MailActivityType = cls.env['mail.activity.type'] cls.MailActivity = cls.env['mail.activity'] cls.company_id = cls.Company._company_default_get() cls.now = datetime(2020, 4, 19, 15, 00) cls.today = cls.now.date() cls.model_res_partner = cls.env['ir.model'].search( [('model', '=', 'res.partner')], limit=1 ) cls.partner_DecoAddict = cls.env['res.partner'].search( [('name', 'ilike', 'Deco Addict')], limit=1 ) def test_none_reminders(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', }) self.assertEqual(activity_type._get_reminder_offsets(), []) def test_empty_reminders(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': ' -./', }) self.assertEqual(activity_type._get_reminder_offsets(), []) def test_delimiters(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0 1_2/3.4t5', }) self.assertEqual(activity_type._get_reminder_offsets(), [ 0, 1, 2, 3, 4, 5 ]) def test_first_notice_is_reminder(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0', }) user = self.ResUsers.sudo().create({ 'name': 'User', 'login': 'user', 'email': 'user@example.com', 'company_id': self.company_id.id, }) activity = self.MailActivity.create({ 'summary': 'Activity', 'activity_type_id': activity_type.id, 'res_model_id': self.model_res_partner.id, 'res_id': self.partner_DecoAddict.id, 'date_deadline': self.today, 'user_id': user.id, }) self.assertTrue(activity.last_reminder_local) def test_reminder_behaviour(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0/2', }) with freeze_time(self.now): activity = self.MailActivity.create({ 'summary': 'Activity', 'activity_type_id': activity_type.id, 'res_model_id': self.model_res_partner.id, 'res_id': self.partner_DecoAddict.id, 'date_deadline': self.today + relativedelta(days=5), }) with freeze_time(self.now): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=2)): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=3)): activities = self.MailActivity._get_activities_to_remind() self.assertEqual(activities, activity) activities.action_remind() with freeze_time(self.now + relativedelta(days=4)): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=5)): activities = self.MailActivity._get_activities_to_remind() self.assertEqual(activities, activity) activities.action_remind() activity.active = False with freeze_time(self.now + relativedelta(days=5)): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities) def test_reminder_flow(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0/2', }) with freeze_time(self.now): activity = self.MailActivity.create({ 'summary': 'Activity', 'activity_type_id': activity_type.id, 'res_model_id': self.model_res_partner.id, 'res_id': self.partner_DecoAddict.id, 'date_deadline': self.today + relativedelta(days=5), }) with freeze_time(self.now): activities = self.MailActivity._process_reminders() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=2)): activities = self.MailActivity._process_reminders() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=3)): activities = self.MailActivity._process_reminders() self.assertEqual(activities, activity) with freeze_time(self.now + relativedelta(days=4)): activities = self.MailActivity._process_reminders() self.assertFalse(activities) with freeze_time(self.now + relativedelta(days=5)): activities = self.MailActivity._process_reminders() self.assertEqual(activities, activity) def test_repeated_reminder(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0', }) with freeze_time(self.now): activity = self.MailActivity.create({ 'summary': 'Activity', 'activity_type_id': activity_type.id, 'res_model_id': self.model_res_partner.id, 'res_id': self.partner_DecoAddict.id, 'date_deadline': self.today + relativedelta(days=1), }) with freeze_time(self.now + relativedelta(days=1)): activities = self.MailActivity._process_reminders() self.assertEqual(activities, activity) activities = self.MailActivity._process_reminders() self.assertFalse(activities) def test_overdue_reminder(self): activity_type = self.MailActivityType.create({ 'name': 'Activity Type', 'reminders': '0', }) with freeze_time(self.now): self.MailActivity.create({ 'summary': 'Activity', 'activity_type_id': activity_type.id, 'res_model_id': self.model_res_partner.id, 'res_id': self.partner_DecoAddict.id, 'date_deadline': self.today + relativedelta(days=1), }) with freeze_time(self.now + relativedelta(days=2)): activities = self.MailActivity._get_activities_to_remind() self.assertFalse(activities)