From ab97d816209759744ea86b5613c1ebdc31bf4f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 8 Aug 2022 15:24:32 +0000 Subject: [PATCH] [FW][FIX][IMP] test_mail_full: improve tests for rendering in mass mode Purpose is to enable dynamic rendering in mass comment mode. This highlights an issue, as currently when using the comment mode on several records body is not rendered, just sent as it is. This means raw dynamic code could be sent. Also cleanup some invalid setup (not enough records for mass) that skipped some tests. Spotted during Task-2613245 (Server actions mail update / cleaning) X-original-commit: odoo/odoo@d5a1c5768bc38a611b6444bdcaddad3021fb5741 Part-of: odoo/odoo#97931 --- .../test_mail_sms/tests/test_sms_composer.py | 119 +++++++++++++----- 1 file changed, 90 insertions(+), 29 deletions(-) diff --git a/addons/test_mail_sms/tests/test_sms_composer.py b/addons/test_mail_sms/tests/test_sms_composer.py index 831fc8d79af..220b84bf4f0 100644 --- a/addons/test_mail_sms/tests/test_sms_composer.py +++ b/addons/test_mail_sms/tests/test_sms_composer.py @@ -210,7 +210,7 @@ class TestSMSComposerBatch(TestSMSCommon): @classmethod def setUpClass(cls): super(TestSMSComposerBatch, cls).setUpClass() - cls._test_body = 'Zizisse an SMS.' + cls._test_body = 'Hello {{ object.name }} zizisse an SMS.' cls._create_records_for_batch('mail.test.sms', 3) cls.sms_template = cls._create_sms_template('mail.test.sms') @@ -229,7 +229,11 @@ class TestSMSComposerBatch(TestSMSCommon): messages = composer._action_send_sms() for record in self.records: - self.assertSMSNotification([{'partner': r.customer_id} for r in self.records], 'Zizisse an SMS.', messages) + self.assertSMSNotification( + [{'partner': record.customer_id}], + 'Hello ${object.name} zizisse an SMS.', + messages + ) def test_composer_batch_res_ids(self): with self.with_user('employee'): @@ -245,7 +249,11 @@ class TestSMSComposerBatch(TestSMSCommon): messages = composer._action_send_sms() for record in self.records: - self.assertSMSNotification([{'partner': r.customer_id} for r in self.records], 'Zizisse an SMS.', messages) + self.assertSMSNotification( + [{'partner': record.customer_id}], + 'Hello ${object.name} zizisse an SMS.', + messages + ) class TestSMSComposerMass(TestSMSCommon): @@ -253,9 +261,9 @@ class TestSMSComposerMass(TestSMSCommon): @classmethod def setUpClass(cls): super(TestSMSComposerMass, cls).setUpClass() - cls._test_body = 'Zizisse an SMS.' + cls._test_body = 'Hello {{ object.name }} zizisse an SMS.' - cls._create_records_for_batch('mail.test.sms', 3) + cls._create_records_for_batch('mail.test.sms', 10) cls.sms_template = cls._create_sms_template('mail.test.sms') def test_composer_mass_active_ids(self): @@ -272,8 +280,11 @@ class TestSMSComposerMass(TestSMSCommon): with self.mockSMSGateway(): composer.action_send_sms() - for partner in self.partners: - self.assertSMSOutgoing(partner, None, content=self._test_body) + for partner, record in zip(self.partners, self.records): + self.assertSMSOutgoing( + partner, None, + content='Hello %s zizisse an SMS.' % record.name + ) def test_composer_mass_active_ids_w_blacklist(self): self.env['phone.blacklist'].create([{ @@ -295,10 +306,17 @@ class TestSMSComposerMass(TestSMSCommon): with self.mockSMSGateway(): composer.action_send_sms() - for partner in self.partners[5:]: - self.assertSMSOutgoing(partner, partner.phone_sanitized, content=self._test_body) - for partner in self.partners[:5]: - self.assertSMSCanceled(partner, partner.phone_sanitized, failure_type='sms_blacklist', content=self._test_body) + for partner, record in zip(self.partners[5:], self.records[5:]): + self.assertSMSOutgoing( + partner, partner.phone_sanitized, + content='Hello %s zizisse an SMS.' % record.name + ) + for partner, record in zip(self.partners[:5], self.records[:5]): + self.assertSMSCanceled( + partner, partner.phone_sanitized, + failure_type='sms_blacklist', + content='Hello %s zizisse an SMS.' % record.name + ) def test_composer_mass_active_ids_wo_blacklist(self): self.env['phone.blacklist'].create([{ @@ -320,17 +338,22 @@ class TestSMSComposerMass(TestSMSCommon): with self.mockSMSGateway(): composer.action_send_sms() - for partner in self.partners: - self.assertSMSOutgoing(partner, partner.phone_sanitized, content=self._test_body) + for partner, record in zip(self.partners, self.records): + self.assertSMSOutgoing( + partner, partner.phone_sanitized, + content='Hello %s zizisse an SMS.' % record.name + ) def test_composer_mass_active_ids_w_blacklist_and_done(self): + """ Create some duplicates + blacklist. record[5] will have duplicated + number on 6 and 7. """ self.env['phone.blacklist'].create([{ 'number': p.phone_sanitized, 'active': True, } for p in self.partners[:5]]) - for p in self.partners[8:]: - p.mobile = self.partners[8].mobile - self.assertEqual(p.phone_sanitized, self.partners[8].phone_sanitized) + for p in self.partners[5:8]: + p.mobile = self.partners[5].mobile + self.assertEqual(p.phone_sanitized, self.partners[5].phone_sanitized) with self.with_user('employee'): composer = self.env['sms.composer'].with_context( @@ -346,12 +369,29 @@ class TestSMSComposerMass(TestSMSCommon): with self.mockSMSGateway(): composer.action_send_sms() - for partner in self.partners[8:]: - self.assertSMSOutgoing(partner, partner.phone_sanitized, content=self._test_body) - for partner in self.partners[5:8]: - self.assertSMSCanceled(partner, partner.phone_sanitized, failure_type='sms_duplicate', content=self._test_body) - for partner in self.partners[:5]: - self.assertSMSCanceled(partner, partner.phone_sanitized, failure_type='sms_blacklist', content=self._test_body) + self.assertSMSOutgoing( + self.partners[5], self.partners[5].phone_sanitized, + content='Hello %s zizisse an SMS.' % self.records[5].name + ) + for partner, record in zip(self.partners[8:], self.records[8:]): + self.assertSMSOutgoing( + partner, partner.phone_sanitized, + content='Hello %s zizisse an SMS.' % record.name + ) + # duplicates + for partner, record in zip(self.partners[6:8], self.records[6:8]): + self.assertSMSCanceled( + partner, partner.phone_sanitized, + failure_type='sms_duplicate', + content='Hello %s zizisse an SMS.' % record.name + ) + # blacklist + for partner, record in zip(self.partners[:5], self.records[:5]): + self.assertSMSCanceled( + partner, partner.phone_sanitized, + failure_type='sms_blacklist', + content='Hello %s zizisse an SMS.' % record.name + ) def test_composer_mass_active_ids_w_template(self): with self.with_user('employee'): @@ -368,7 +408,10 @@ class TestSMSComposerMass(TestSMSCommon): composer.action_send_sms() for record in self.records: - self.assertSMSOutgoing(record.customer_id, None, content='Dear %s this is an SMS.' % record.display_name) + self.assertSMSOutgoing( + record.customer_id, None, + content='Dear %s this is an SMS.' % record.display_name + ) def test_composer_mass_active_ids_w_template_and_lang(self): self.env['res.lang']._activate_lang('fr_FR') @@ -402,9 +445,15 @@ class TestSMSComposerMass(TestSMSCommon): for record in self.records: if record.customer_id == self.partners[2]: - self.assertSMSOutgoing(record.customer_id, None, content='Cher·e· %s ceci est un SMS.' % record.display_name) + self.assertSMSOutgoing( + record.customer_id, None, + content='Cher·e· %s ceci est un SMS.' % record.display_name + ) else: - self.assertSMSOutgoing(record.customer_id, None, content='Dear %s this is an SMS.' % record.display_name) + self.assertSMSOutgoing( + record.customer_id, None, + content='Dear %s this is an SMS.' % record.display_name + ) def test_composer_mass_active_ids_w_template_and_log(self): with self.with_user('employee'): @@ -421,7 +470,10 @@ class TestSMSComposerMass(TestSMSCommon): composer.action_send_sms() for record in self.records: - self.assertSMSOutgoing(record.customer_id, None, content='Dear %s this is an SMS.' % record.display_name) + 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) def test_composer_template_context_action(self): @@ -471,7 +523,10 @@ class TestSMSComposerMass(TestSMSCommon): messages = composer._action_send_sms() number = self.partners[2].phone_get_sanitized_number() - self.assertSMSNotification([{'partner': test_record_2.customer_id, 'number': number}], "Hello %s ceci est en français." % test_record_2.display_name, messages) + self.assertSMSNotification( + [{'partner': test_record_2.customer_id, 'number': number}], + "Hello %s ceci est en français." % test_record_2.display_name, messages + ) # Composer creation with context from a template context action (simulate) - mass (multiple recipient) with self.with_user('employee'): @@ -493,5 +548,11 @@ class TestSMSComposerMass(TestSMSCommon): with self.mockSMSGateway(): composer.action_send_sms() - self.assertSMSOutgoing(test_record_1.customer_id, None, content='Dear %s this is an SMS.' % test_record_1.display_name) - self.assertSMSOutgoing(test_record_2.customer_id, None, content="Hello %s ceci est en français." % test_record_2.display_name) + self.assertSMSOutgoing( + test_record_1.customer_id, None, + content='Dear %s this is an SMS.' % test_record_1.display_name + ) + self.assertSMSOutgoing( + test_record_2.customer_id, None, + content="Hello %s ceci est en français." % test_record_2.display_name + )