odoo18/addons/sms_twilio/tests/test_sms_twilio.py

191 lines
8.2 KiB
Python

from odoo.addons.sms_twilio.tests.common import MockSmsTwilio
from odoo.tests import tagged, users
@tagged('post_install', '-at_install', 'twilio')
class TestSmsTwilio(MockSmsTwilio):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls._setup_sms_twilio(cls.user_admin.company_id)
def test_assert_initial_values(self):
self.assertEqual(self.valid_partner.phone, self.twilio_valid_phone_number)
self.assertEqual(self.invalid_partner.phone, self.twilio_invalid_phone_number)
@users('employee')
def test_send_sms_composer_number(self):
for number, twilio_error, expected_status, expected_failure_type, expected_to_delete in [
(self.twilio_valid_phone_number, False, "pending", False, True),
# check some error code support
(self.twilio_valid_phone_number, "twilio_callback", "error", "twilio_callback", False),
(self.twilio_invalid_phone_number, "wrong_number_format", "error", "sms_number_format", False),
(self.twilio_invalid_phone_number, "sms_number_missing", "error", "sms_number_missing", False),
]:
with self.subTest(number=number, twilio_error=twilio_error):
with self.mock_sms_twilio_gateway(error_type=twilio_error):
body = f"Send SMS to {number}"
composer = self.env['sms.composer'].create({
'body': body,
'composition_mode': 'numbers',
'numbers': number,
})
composer._action_send_sms()
self.assertSMS(
self.env["res.partner"], number, expected_status,
content=body,
failure_type=expected_failure_type,
fields_values={
"to_delete": expected_to_delete,
},
)
@users('employee')
def test_send_sms_composer_partner(self):
for partner, twilio_error, exp_notif_status, exp_failure_type, exp_failure_reason, exp_to_delete in [
(self.valid_partner, False, "pending", False, False, True),
# twilio specific issues
(
self.invalid_partner, "twilio_acc_unverified", "exception", "sms_acc",
"Unverified recipient on Trial Account", False
), (
self.invalid_partner, "twilio_callback", "exception", "twilio_callback",
"Twilio StatusCallback URL is incorrect", False
),
# check some error code support
(
self.invalid_partner, "wrong_number_format", "exception", "sms_number_format",
"The number you're trying to reach is not correctly formatted", False
), (
self.invalid_partner, "sms_number_missing", "exception", "sms_number_missing",
"A 'To' phone number is required", False
),
]:
with self.subTest(partner=partner, number=partner.phone, twilio_error=twilio_error):
with self.mock_sms_twilio_gateway(error_type=twilio_error):
body = f"Send SMS to {partner.name}"
composer = self.env['sms.composer'].with_context(
active_model='res.partner',
active_id=partner.id,
).create({'body': body})
message = composer._action_send_sms()
self.assertEqual(len(message), 1)
self.assertSMSNotification(
[{
'number': partner.phone, 'partner': partner,
'failure_type': exp_failure_type, 'failure_reason': exp_failure_reason,
'state': exp_notif_status,
'sms_fields_values': {
"to_delete": exp_to_delete,
},
}], body,
messages=message,
)
@users('employee')
def test_send_with_multi_company(self):
"""Test that in a multi company environment where each company decides
how it should send SMS that we respect this choice. """
company_twilio = self.env.company
company_twilio.sudo().write({
"name": "Company 1 (Twilio)",
"sms_provider": "twilio",
})
company_twilio_2 = self.env['res.company'].sudo().create({
"name": "Company 2 (Twilio)",
"sms_provider": "twilio",
"sms_twilio_account_sid": "AC11111222223333344444555556666677",
"sms_twilio_auth_token": "skarsnik",
})
company_iap = self.env['res.company'].sudo().create({
"name": "Company 3 (IAP)",
"sms_provider": "iap",
})
company_iap_2 = self.env['res.company'].sudo().create({
"name": "Company 4 (IAP)",
"sms_provider": "iap",
})
self.env.user.sudo().company_ids |= company_twilio_2 + company_iap + company_iap_2
partners_twilio = self.env['res.partner'].create([{
"name": f"Partner Twilio {i}",
"phone": f"+1220215411{i}",
"company_id": company_twilio.id
} for i in range(2)])
partners_twilio_2 = self.env['res.partner'].create([{
"name": f"Partner Twilio2 {i}",
"phone": f"+1220215422{i}",
"company_id": company_twilio_2.id
} for i in range(2)])
partners_iap = self.env['res.partner'].create([{
"name": f"Partner IAP {i}",
"phone": f"+1220215433{i}",
"company_id": company_iap.id
} for i in range(2)])
partners_iap_2 = self.env['res.partner'].create([{
"name": f"Partner IAP2 {i}",
"phone": f"+1220215444{i}",
"company_id": company_iap_2.id
} for i in range(2)])
with (
self.mockSMSGateway(),
self.mock_sms_twilio_send(),
):
composer_twilio = self.env['sms.composer'].create({
"body": "Mixed SMS",
"composition_mode": 'mass',
"mass_force_send": True,
"res_ids": (partners_twilio + partners_twilio_2 + partners_iap + partners_iap_2).ids,
"res_model": "res.partner",
})
composer_twilio._action_send_sms()
# should call twilio 4 times (4 partners, one number at a time) and IAP 1 time (batch, even different companies)
self.assertEqual(self._sms_twilio_send_mock.call_count, 4)
self.assertEqual(self._sms_api_contact_iap_mock.call_count, 1)
# check SMS statuses
# TDE FIXME: in mass mode without mailing, no sms_tracker are created hence
# sms_twilio_sid is not stored ... meh
for partner in partners_twilio:
self.assertSMS(
partner, partner.phone, "pending",
content="Mixed SMS",
failure_type=False,
fields_values={
"record_company_id": company_twilio,
},
)
for partner in partners_twilio_2:
self.assertSMS(
partner, partner.phone, "pending",
content="Mixed SMS",
failure_type=False,
fields_values={
"record_company_id": company_twilio_2,
},
)
for partner in partners_iap:
self.assertSMS(
partner, partner.phone, "pending",
content="Mixed SMS",
failure_type=False,
fields_values={
"record_company_id": company_iap,
},
)
for partner in partners_iap_2:
self.assertSMS(
partner, partner.phone, "pending",
content="Mixed SMS",
failure_type=False,
fields_values={
"record_company_id": company_iap_2,
},
)