136 lines
6.8 KiB
Python
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')
|