PURPOSE
Purpose is to have more tests when sending sms mailings, notably about
canceled or failed mails or sms as well as jinja and links rendering.
SPECIFICATIONS
In this commit we improve SMS Marketing mailing tests. We notably
* add tests for void and invalid email and numbers. It allows to check they
correctly update their trace status;
* add tests for unsubscribe and view links embedded in sms marketing;
* add tests to simulate a click on links sent through sms marketing and
ensure click statistics are effectively updated;
* ensure content of sent sms are checked;
Default content of mailings used in test is updated to ensure jinja is
correctly rendered, including links and some corner cases. This will also
helps ensuring behavior is kept when converting to QWeb.
In event we now correctly use sms gateway mock to ensure SMS finding.
In link_tracker a helper is added to check url tracking in plaintext content.
LINKS
Task ID-2508643
Followup of odoo/odoo#68874 (improve mail tests)
Prepares Task ID-27033 (support QWeb in templates)
Prepares Task ID-2377974 (clean trace and status management in mass mailing)
COM PR odoo/odoo#69461
ENT PR odoo/enterprise#17780
X-original-commit: f1182b9da9aca9e67518fc10c240f3b21895a7ab
420 lines
22 KiB
Python
420 lines
22 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.addons.test_mail_full.tests.common import TestMailFullCommon, TestMailFullRecipients
|
|
|
|
|
|
class TestSMSPost(TestMailFullCommon, TestMailFullRecipients):
|
|
""" TODO
|
|
|
|
* add tests for new mail.message and mail.thread fields;
|
|
"""
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestSMSPost, cls).setUpClass()
|
|
cls._test_body = 'VOID CONTENT'
|
|
|
|
cls.test_record = cls.env['mail.test.sms'].with_context(**cls._test_context).create({
|
|
'name': 'Test',
|
|
'customer_id': cls.partner_1.id,
|
|
'mobile_nbr': cls.test_numbers[0],
|
|
'phone_nbr': cls.test_numbers[1],
|
|
})
|
|
cls.test_record = cls._reset_mail_context(cls.test_record)
|
|
|
|
def test_message_sms_internals_body(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms('<p>Mega SMS<br/>Top moumoutte</p>', partner_ids=self.partner_1.ids)
|
|
|
|
self.assertEqual(messages.body, '<p>Mega SMS<br>Top moumoutte</p>')
|
|
self.assertEqual(messages.subtype_id, self.env.ref('mail.mt_note'))
|
|
self.assertSMSNotification([{'partner': self.partner_1}], 'Mega SMS\nTop moumoutte', messages)
|
|
|
|
def test_message_sms_internals_check_existing(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(sim_error='wrong_number_format'):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=self.partner_1.ids)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'state': 'exception', 'failure_type': 'sms_number_format'}], self._test_body, messages)
|
|
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
test_record._notify_record_by_sms(messages, [{'id': self.partner_1.id, 'notif': 'sms'}], check_existing=True)
|
|
self.assertSMSNotification([{'partner': self.partner_1}], self._test_body, messages)
|
|
|
|
def test_message_sms_internals_sms_numbers(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=self.partner_1.ids, sms_numbers=self.random_numbers)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1}, {'number': self.random_numbers_san[0]}, {'number': self.random_numbers_san[1]}], self._test_body, messages)
|
|
|
|
def test_message_sms_internals_subtype(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms('<p>Mega SMS<br/>Top moumoutte</p>', subtype_id=self.env.ref('mail.mt_comment').id, partner_ids=self.partner_1.ids)
|
|
|
|
self.assertEqual(messages.body, '<p>Mega SMS<br>Top moumoutte</p>')
|
|
self.assertEqual(messages.subtype_id, self.env.ref('mail.mt_comment'))
|
|
self.assertSMSNotification([{'partner': self.partner_1}], 'Mega SMS\nTop moumoutte', messages)
|
|
|
|
def test_message_sms_internals_pid_to_number(self):
|
|
pid_to_number = {
|
|
self.partner_1.id: self.random_numbers[0],
|
|
self.partner_2.id: self.random_numbers[1],
|
|
}
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2).ids, sms_pid_to_number=pid_to_number)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'number': self.random_numbers_san[0]},
|
|
{'partner': self.partner_2, 'number': self.random_numbers_san[1]}],
|
|
self._test_body, messages)
|
|
|
|
def test_message_sms_model_partner(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
messages = self.partner_1._message_sms(self._test_body)
|
|
messages |= self.partner_2._message_sms(self._test_body)
|
|
self.assertSMSNotification([{'partner': self.partner_1}, {'partner': self.partner_2}], self._test_body, messages)
|
|
|
|
def test_message_sms_model_partner_fallback(self):
|
|
self.partner_1.write({'mobile': False, 'phone': self.random_numbers[0]})
|
|
|
|
with self.mockSMSGateway():
|
|
messages = self.partner_1._message_sms(self._test_body)
|
|
messages |= self.partner_2._message_sms(self._test_body)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'number': self.random_numbers_san[0]}, {'partner': self.partner_2}], self._test_body, messages)
|
|
|
|
def test_message_sms_model_w_partner_only(self):
|
|
with self.with_user('employee'):
|
|
record = self.env['mail.test.sms.partner'].create({'partner_id': self.partner_1.id})
|
|
|
|
with self.mockSMSGateway():
|
|
messages = record._message_sms(self._test_body)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1}], self._test_body, messages)
|
|
|
|
def test_message_sms_model_w_partner_only_void(self):
|
|
with self.with_user('employee'):
|
|
record = self.env['mail.test.sms.partner'].create({'partner_id': False})
|
|
|
|
with self.mockSMSGateway():
|
|
messages = record._message_sms(self._test_body)
|
|
|
|
# should not crash but have a failed notification
|
|
self.assertSMSNotification([{'partner': self.env['res.partner'], 'number': False, 'state': 'exception', 'failure_type': 'sms_number_missing'}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_field_w_partner(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, number_field='mobile_nbr')
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'number': self.test_record.mobile_nbr}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_field_wo_partner(self):
|
|
self.test_record.write({'customer_id': False})
|
|
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, number_field='mobile_nbr')
|
|
|
|
self.assertSMSNotification([{'number': self.test_record.mobile_nbr}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_field_wo_partner_wo_value(self):
|
|
""" Test record without a partner and without phone values. """
|
|
self.test_record.write({
|
|
'customer_id': False,
|
|
'phone_nbr': False,
|
|
'mobile_nbr': False,
|
|
})
|
|
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body)
|
|
|
|
# should not crash but have a failed notification
|
|
self.assertSMSNotification([{'partner': self.env['res.partner'], 'number': False, 'state': 'exception', 'failure_type': 'sms_number_missing'}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_field_wo_partner_default_field(self):
|
|
self.test_record.write({'customer_id': False})
|
|
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body)
|
|
|
|
self.assertSMSNotification([{'number': self.test_numbers_san[1]}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_field_wo_partner_default_field_2(self):
|
|
self.test_record.write({'customer_id': False, 'phone_nbr': False})
|
|
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body)
|
|
|
|
self.assertSMSNotification([{'number': self.test_numbers_san[0]}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_numbers(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, sms_numbers=self.random_numbers_san)
|
|
self.assertSMSNotification([{'number': self.random_numbers_san[0]}, {'number': self.random_numbers_san[1]}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_numbers_sanitization(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, sms_numbers=self.random_numbers)
|
|
self.assertSMSNotification([{'number': self.random_numbers_san[0]}, {'number': self.random_numbers_san[1]}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_partner_ids(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2).ids)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1}, {'partner': self.partner_2}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_partner_ids_default(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body)
|
|
|
|
self.assertSMSNotification([{'partner': self.test_record.customer_id, 'number': self.test_numbers_san[1]}], self._test_body, messages)
|
|
|
|
def test_message_sms_on_partner_ids_w_numbers(self):
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=self.partner_1.ids, sms_numbers=self.random_numbers[:1])
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1}, {'number': self.random_numbers_san[0]}], self._test_body, messages)
|
|
|
|
def test_message_sms_with_template(self):
|
|
sms_template = self.env['sms.template'].create({
|
|
'name': 'Test Template',
|
|
'model_id': self.env['ir.model']._get('mail.test.sms').id,
|
|
'body': 'Dear ${object.display_name} this is an SMS.',
|
|
})
|
|
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms_with_template(template=sms_template)
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'number': self.test_numbers_san[1]}], 'Dear %s this is an SMS.' % self.test_record.display_name, messages)
|
|
|
|
def test_message_sms_with_template_fallback(self):
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms_with_template(template_xmlid='test_mail_full.this_should_not_exists', template_fallback='Fallback for ${object.id}')
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'number': self.test_numbers_san[1]}], 'Fallback for %s' % self.test_record.id, messages)
|
|
|
|
def test_message_sms_with_template_xmlid(self):
|
|
sms_template = self.env['sms.template'].create({
|
|
'name': 'Test Template',
|
|
'model_id': self.env['ir.model']._get('mail.test.sms').id,
|
|
'body': 'Dear ${object.display_name} this is an SMS.',
|
|
})
|
|
self.env['ir.model.data'].create({
|
|
'name': 'this_should_exists',
|
|
'module': 'test_mail_full',
|
|
'model': sms_template._name,
|
|
'res_id': sms_template.id,
|
|
})
|
|
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms_with_template(template_xmlid='test_mail_full.this_should_exists')
|
|
|
|
self.assertSMSNotification([{'partner': self.partner_1, 'number': self.test_numbers_san[1]}], 'Dear %s this is an SMS.' % self.test_record.display_name, messages)
|
|
|
|
|
|
class TestSMSPostException(TestMailFullCommon, TestMailFullRecipients):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestSMSPostException, cls).setUpClass()
|
|
cls._test_body = 'VOID CONTENT'
|
|
|
|
cls.test_record = cls.env['mail.test.sms'].with_context(**cls._test_context).create({
|
|
'name': 'Test',
|
|
'customer_id': cls.partner_1.id,
|
|
})
|
|
cls.test_record = cls._reset_mail_context(cls.test_record)
|
|
cls.partner_3 = cls.env['res.partner'].with_context({
|
|
'mail_create_nolog': True,
|
|
'mail_create_nosubscribe': True,
|
|
'mail_notrack': True,
|
|
'no_reset_password': True,
|
|
}).create({
|
|
'name': 'Ernestine Loubine',
|
|
'email': 'ernestine.loubine@agrolait.com',
|
|
'country_id': cls.env.ref('base.be').id,
|
|
'mobile': '0475556644',
|
|
})
|
|
|
|
def test_message_sms_w_numbers_invalid(self):
|
|
random_numbers = self.random_numbers + ['6988754']
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, sms_numbers=random_numbers)
|
|
|
|
# invalid numbers are still given to IAP currently as they are
|
|
self.assertSMSNotification([{'number': self.random_numbers_san[0]}, {'number': self.random_numbers_san[1]}, {'number': random_numbers[2]}], self._test_body, messages)
|
|
|
|
def test_message_sms_w_partners_nocountry(self):
|
|
self.test_record.customer_id.write({
|
|
'mobile': self.random_numbers[0],
|
|
'phone': self.random_numbers[1],
|
|
'country_id': False,
|
|
})
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=self.test_record.customer_id.ids)
|
|
|
|
self.assertSMSNotification([{'partner': self.test_record.customer_id}], self._test_body, messages)
|
|
|
|
def test_message_sms_w_partners_falsy(self):
|
|
# TDE FIXME: currently sent to IAP
|
|
self.test_record.customer_id.write({
|
|
'mobile': 'youpie',
|
|
'phone': 'youpla',
|
|
})
|
|
with self.with_user('employee'), self.mockSMSGateway():
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=self.test_record.customer_id.ids)
|
|
|
|
# self.assertSMSNotification({self.test_record.customer_id: {}}, {}, self._test_body, messages)
|
|
|
|
def test_message_sms_w_numbers_sanitization_duplicate(self):
|
|
pass
|
|
# TDE FIXME: not sure
|
|
# random_numbers = self.random_numbers + [self.random_numbers[1]]
|
|
# random_numbers_san = self.random_numbers_san + [self.random_numbers_san[1]]
|
|
# with self.with_user('employee'), self.mockSMSGateway():
|
|
# messages = self.test_record._message_sms(self._test_body, sms_numbers=random_numbers)
|
|
# self.assertSMSNotification({}, {random_numbers_san[0]: {}, random_numbers_san[1]: {}, random_numbers_san[2]: {}}, self._test_body, messages)
|
|
|
|
def test_message_sms_crash_credit(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(sim_error='credit'):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'exception', 'failure_type': 'sms_credit'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_credit'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_credit_single(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(nbr_t_error={self.partner_2.phone_get_sanitized_number(): 'credit'}):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2 | self.partner_3).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'sent'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_credit'},
|
|
{'partner': self.partner_3, 'state': 'sent'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_server_crash(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(sim_error='jsonrpc_exception'):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2 | self.partner_3).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'exception', 'failure_type': 'sms_server'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_server'},
|
|
{'partner': self.partner_3, 'state': 'exception', 'failure_type': 'sms_server'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_unregistered(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(sim_error='unregistered'):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'exception', 'failure_type': 'sms_acc'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_acc'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_unregistered_single(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(nbr_t_error={self.partner_2.phone_get_sanitized_number(): 'unregistered'}):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2 | self.partner_3).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'sent'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_acc'},
|
|
{'partner': self.partner_3, 'state': 'sent'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_wrong_number(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(sim_error='wrong_number_format'):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'exception', 'failure_type': 'sms_number_format'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_number_format'},
|
|
], self._test_body, messages)
|
|
|
|
def test_message_sms_crash_wrong_number_single(self):
|
|
with self.with_user('employee'), self.mockSMSGateway(nbr_t_error={self.partner_2.phone_get_sanitized_number(): 'wrong_number_format'}):
|
|
test_record = self.env['mail.test.sms'].browse(self.test_record.id)
|
|
messages = test_record._message_sms(self._test_body, partner_ids=(self.partner_1 | self.partner_2 | self.partner_3).ids)
|
|
|
|
self.assertSMSNotification([
|
|
{'partner': self.partner_1, 'state': 'sent'},
|
|
{'partner': self.partner_2, 'state': 'exception', 'failure_type': 'sms_number_format'},
|
|
{'partner': self.partner_3, 'state': 'sent'},
|
|
], self._test_body, messages)
|
|
|
|
|
|
class TestSMSApi(TestMailFullCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestSMSApi, cls).setUpClass()
|
|
cls._test_body = 'Zizisse an SMS.'
|
|
|
|
cls._create_records_for_batch('mail.test.sms', 3)
|
|
cls.sms_template = cls._create_sms_template('mail.test.sms')
|
|
|
|
def test_message_schedule_sms(self):
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
self.env['mail.test.sms'].browse(self.records.ids)._message_sms_schedule_mass(body=self._test_body, mass_keep_log=False)
|
|
|
|
for record in self.records:
|
|
self.assertSMSOutgoing(record.customer_id, None, content=self._test_body)
|
|
|
|
def test_message_schedule_sms_w_log(self):
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
self.env['mail.test.sms'].browse(self.records.ids)._message_sms_schedule_mass(body=self._test_body, mass_keep_log=True)
|
|
|
|
for record in self.records:
|
|
self.assertSMSOutgoing(record.customer_id, None, content=self._test_body)
|
|
self.assertSMSLogged(record, self._test_body)
|
|
|
|
def test_message_schedule_sms_w_template(self):
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
self.env['mail.test.sms'].browse(self.records.ids)._message_sms_schedule_mass(template=self.sms_template, mass_keep_log=False)
|
|
|
|
for record in self.records:
|
|
self.assertSMSOutgoing(record.customer_id, None, content='Dear %s this is an SMS.' % record.display_name)
|
|
|
|
def test_message_schedule_sms_w_template_and_log(self):
|
|
with self.with_user('employee'):
|
|
with self.mockSMSGateway():
|
|
self.env['mail.test.sms'].browse(self.records.ids)._message_sms_schedule_mass(template=self.sms_template, mass_keep_log=True)
|
|
|
|
for record in self.records:
|
|
self.assertSMSOutgoing(record.customer_id, None, content='Dear %s this is an SMS.' % record.display_name)
|
|
self.assertSMSLogged(record, 'Dear %s this is an SMS.' % record.display_name)
|