mass_mailing/tests/test_mailing_mailing_schedule_date.py

136 lines
6.8 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from freezegun import freeze_time
from odoo.addons.base.tests.test_ir_cron import CronMixinCase
from odoo.addons.mass_mailing.tests.common import MassMailCommon
from odoo.tests import users, Form
from odoo.tools import mute_logger
class TestMailingScheduleDateWizard(MassMailCommon, CronMixinCase):
@mute_logger('odoo.addons.mail.models.mail_mail')
@users('user_marketing')
def test_mailing_next_departure(self):
# test if mailing.mailing.next_departure is correctly set taking into account
# presence of implicitly created cron triggers (since odoo v15). These should
# launch cron job before its schedule nextcall datetime (if scheduled_date < nextcall)
cron_job = self.env.ref('mass_mailing.ir_cron_mass_mailing_queue').sudo()
cron_job.write({'nextcall' : datetime(2023, 2, 18, 9, 0)})
cron_job_id = cron_job.id
# case where user click on "Send" button (action_launch)
with freeze_time(datetime(2023, 2, 17, 9, 0)):
with self.capture_triggers(cron_job_id) as capt:
mailing = self.env['mailing.mailing'].create({
'name': 'mailing',
'subject': 'some subject',
'mailing_model_id': self.env['ir.model']._get('res.partner').id,
'state' : 'draft'
})
mailing.action_launch()
capt.records.ensure_one()
# assert that the schedule_date and schedule_type fields are correct and that the mailing is put in queue
self.assertEqual(mailing.next_departure, datetime(2023, 2, 17, 9, 0))
self.assertIsNot(mailing.schedule_date, cron_job.nextcall)
self.assertEqual(mailing.schedule_type, 'now')
self.assertEqual(mailing.state, 'in_queue')
self.assertEqual(capt.records.call_at, datetime(2023, 2, 17, 9, 0)) #verify that cron.trigger exists
# case where client uses schedule wizard to chose a date between now and cron.job nextcall
with freeze_time(datetime(2023, 2, 17, 9, 0)):
with self.capture_triggers(cron_job_id) as capt:
mailing = self.env['mailing.mailing'].create({
'name': 'mailing',
'subject': 'some subject',
'mailing_model_id': self.env['ir.model']._get('res.partner').id,
'state' : 'draft',
'schedule_date' : datetime(2023, 2, 17, 11, 0),
'schedule_type' : 'scheduled'
})
mailing.action_schedule()
capt.records.ensure_one()
self.assertEqual(mailing.schedule_date, datetime(2023, 2, 17, 11, 0))
self.assertEqual(mailing.next_departure, datetime(2023, 2, 17, 11, 0))
self.assertEqual(mailing.schedule_type, 'scheduled')
self.assertEqual(mailing.state, 'in_queue')
self.assertEqual(capt.records.call_at, datetime(2023, 2, 17, 11, 0)) #verify that cron.trigger exists
# case where client uses schedule wizard to chose a date after cron.job nextcall
# which means mails will get send after that date (datetime(2023, 2, 18, 9, 0))
with freeze_time(datetime(2023, 2, 17, 9, 0)):
with self.capture_triggers(cron_job_id) as capt:
mailing = self.env['mailing.mailing'].create({
'name': 'mailing',
'subject': 'some subject',
'mailing_model_id': self.env['ir.model']._get('res.partner').id,
'state' : 'draft',
'schedule_date' : datetime(2024, 2, 17, 11, 0),
'schedule_type' : 'scheduled'
})
mailing.action_schedule()
capt.records.ensure_one()
self.assertEqual(mailing.schedule_date, datetime(2024, 2, 17, 11, 0))
self.assertEqual(mailing.next_departure, datetime(2024, 2, 17, 11, 0))
self.assertEqual(mailing.schedule_type, 'scheduled')
self.assertEqual(mailing.state, 'in_queue')
self.assertEqual(capt.records.call_at, datetime(2024, 2, 17, 11, 0)) #verify that cron.trigger exists
# case where client uses schedule wizard to chose a date in the past
with freeze_time(datetime(2023, 2, 17, 9, 0)):
with self.capture_triggers(cron_job_id) as capt:
mailing = self.env['mailing.mailing'].create({
'name': 'mailing',
'subject': 'some subject',
'mailing_model_id': self.env['ir.model']._get('res.partner').id,
'state' : 'draft',
'schedule_date' : datetime(2024, 2, 17, 11, 0),
'schedule_type' : 'scheduled'
})
# create a schedule date wizard
# Have to use wizard for this case to simulate schedule date in the past
# Otherwise "state" doesn't get update from draft to'in_queue'
# in test env vs production env (see mailing.mailing.schedule.date wizard)
wizard_form = Form(
self.env['mailing.mailing.schedule.date'].with_context(default_mass_mailing_id=mailing.id))
# set a schedule date
wizard_form.schedule_date = datetime(2022, 2, 17, 11, 0)
wizard = wizard_form.save()
wizard.action_schedule_date()
capt.records.ensure_one()
self.assertEqual(mailing.schedule_date, datetime(2022, 2, 17, 11, 0))
self.assertEqual(mailing.next_departure, datetime(2023, 2, 17, 9, 0)) #now
self.assertEqual(mailing.schedule_type, 'scheduled')
self.assertEqual(mailing.state, 'in_queue')
self.assertEqual(capt.records.call_at, datetime(2022, 2, 17, 11, 0)) #verify that cron.trigger exists
def test_mailing_schedule_date(self):
mailing = self.env['mailing.mailing'].create({
'name': 'mailing',
'subject': 'some subject',
'mailing_model_id': self.env['ir.model']._get('res.partner').id,
})
# create a schedule date wizard
wizard_form = Form(
self.env['mailing.mailing.schedule.date'].with_context(default_mass_mailing_id=mailing.id))
# set a schedule date
wizard_form.schedule_date = datetime(2021, 4, 30, 9, 0)
wizard = wizard_form.save()
wizard.action_schedule_date()
# assert that the schedule_date and schedule_type fields are correct and that the mailing is put in queue
self.assertEqual(mailing.schedule_date, datetime(2021, 4, 30, 9, 0))
self.assertEqual(mailing.schedule_type, 'scheduled')
self.assertEqual(mailing.state, 'in_queue')