diff options
| author | Thibault Delavallée <tde@odoo.com> | 2020-05-26 09:50:51 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2020-05-26 10:35:58 +0000 |
| commit | e8b1e2b7e448e0e29ca75c1585814788345c643b (patch) | |
| tree | 4c9253613b7abe12699cac169850b15a7687dca1 /addons | |
| parent | c13c3318b2eb32366fe342edb934461c4efbffcd (diff) | |
[IMP] sms, link_tracker: clean some test helpers and add an helper to click SMS links
Clean some helpers, and add a helper to simulata a click on a shortened link
embedded in an SMS.
Task ID 2247037
Community PR #50384
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/link_tracker/tests/common.py | 6 | ||||
| -rw-r--r-- | addons/mass_mailing/tests/test_mailing_internals.py | 2 | ||||
| -rw-r--r-- | addons/mass_mailing_sms/tests/common.py | 48 | ||||
| -rw-r--r-- | addons/sms/tests/common.py | 43 |
4 files changed, 70 insertions, 29 deletions
diff --git a/addons/link_tracker/tests/common.py b/addons/link_tracker/tests/common.py index 16fe77aabce..2d4c651dcd4 100644 --- a/addons/link_tracker/tests/common.py +++ b/addons/link_tracker/tests/common.py @@ -31,10 +31,10 @@ class MockLinkTracker(common.BaseCase): ]) return code.link_id - def assertLinkShortened(self, body, link_info, link_params=None): - """ Usage + def assertLinkShortenedHtml(self, body, link_info, link_params=None): + """ Find shortened links in an HTML content. Usage : - self.assertLinkShortened( + self.assertLinkShortenedHtml( message.body, ('url0', 'http://www.odoo.com', True), {'utm_campaign': self.utm_c.name, 'utm_medium': self.utm_m.name} diff --git a/addons/mass_mailing/tests/test_mailing_internals.py b/addons/mass_mailing/tests/test_mailing_internals.py index f19685bdcd0..0f7a9a831e9 100644 --- a/addons/mass_mailing/tests/test_mailing_internals.py +++ b/addons/mass_mailing/tests/test_mailing_internals.py @@ -252,7 +252,7 @@ Email: <a id="url5" href="mailto:test@odoo.com">test@odoo.com</a></div>""", link_params = {'utm_medium': 'Email', 'utm_source': mailing.name} if link_info[0] == 'url4': link_params['baz'] = 'qux' - self.assertLinkShortened( + self.assertLinkShortenedHtml( new_mail.mail_message_id.body, link_info, link_params=link_params, diff --git a/addons/mass_mailing_sms/tests/common.py b/addons/mass_mailing_sms/tests/common.py index 4a17519b3d6..67b8a4d38ee 100644 --- a/addons/mass_mailing_sms/tests/common.py +++ b/addons/mass_mailing_sms/tests/common.py @@ -1,11 +1,42 @@ # -*- coding: utf-8 -*- +import re +import werkzeug + +from odoo import tools from odoo.addons.mass_mailing.tests.common import MassMailCommon from odoo.addons.sms.tests.common import SMSCase, SMSCommon class MassSMSCase(SMSCase): + # ------------------------------------------------------------ + # GATEWAY TOOLS + # ------------------------------------------------------------ + + def gateway_sms_click(self, sent_sms): + """ Simulate a click on a sent SMS. Usage: giving a partner and/or + a number, find an SMS sent to him, find shortened links in its body + and call add_click to simulate a click. """ + for url in re.findall(tools.TEXT_URL_REGEX, sent_sms['body']): + if '/r' in url: # shortened link, like 'http://localhost:8069/r/LBG/s/53' + parsed_url = werkzeug.urls.url_parse(url) + path_items = parsed_url.path.split('/') + code, sms_sms_id = path_items[2], int(path_items[4]) + trace_id = self.env['mailing.trace'].sudo().search([('sms_sms_id_int', '=', sms_sms_id)]).id + + self.env['link.tracker.click'].sudo().add_click( + code, + ip='100.200.300.400', + country_code='BE', + mailing_trace_id=trace_id + ) + + + # ------------------------------------------------------------ + # ASSERTS + # ------------------------------------------------------------ + def assertSMSOutgoingStatistics(self, partners, numbers, records, mailing): found_sms = self.env['sms.sms'].sudo().search([ '|', ('partner_id', 'in', partners.ids), ('number', 'in', numbers), @@ -26,13 +57,16 @@ class MassSMSCase(SMSCase): def assertSMSStatistics(self, recipients_info, mailing, records, check_sms=True): """ Check content of notifications. - :param recipients_info: list[{ - 'partner': res.partner record (may be empty), - 'number': number used for notification (may be empty, computed based on partner), - 'state': outgoing / sent / ignored / exception / opened (sent by default), - 'record: linked record, - 'failure_type': optional: sms_number_missing / sms_number_format / sms_credit / sms_server - }, { ... }] + :param recipients_info: list[{ + 'partner': res.partner record (may be empty), + 'number': number used for notification (may be empty, computed based on partner), + 'state': outgoing / sent / ignored / exception / opened (sent by default), + 'record: linked record, + 'content': optional: if set, check content of sent SMS + 'failure_type': optional: sms_number_missing / sms_number_format / sms_credit / sms_server + }, + { ... } + ] """ traces = self.env['mailing.trace'].search([ ('mass_mailing_id', 'in', mailing.ids), diff --git a/addons/sms/tests/common.py b/addons/sms/tests/common.py index a3d1e3b292a..d225390f02c 100644 --- a/addons/sms/tests/common.py +++ b/addons/sms/tests/common.py @@ -66,6 +66,28 @@ class SMSCase(MockSMS): """ Main test class to use when testing SMS integrations. Contains helpers and tools related to notification sent by SMS. """ + def _find_sms_sent(self, partner, number): + if number is None and partner: + number = partner.phone_get_sanitized_number() + sent_sms = next((sms for sms in self._sms if sms['number'] == number), None) + if not sent_sms: + raise AssertionError('sent sms not found for %s (number: %s)' % (partner, number)) + return sent_sms + + def _find_sms_sms(self, partner, number, status): + if number is None and partner: + number = partner.phone_get_sanitized_number() + domain = [('partner_id', '=', partner.id), ('number', '=', number)] + if status: + domain += [('state', '=', status)] + + sms = self.env['sms.sms'].sudo().search(domain) + if not sms: + raise AssertionError('sms.sms not found for %s (number: %s / status %s)' % (partner, number, status)) + if len(sms) > 1: + raise NotImplementedError() + return sms + def assertSMSSent(self, numbers, content=None): """ Check sent SMS. Order is not checked. Each number should have received the same content. Useful to check batch sending. @@ -82,12 +104,7 @@ class SMSCase(MockSMS): def assertSMSCanceled(self, partner, number, error_code, content=None): """ Check canceled SMS. Search is done for a pair partner / number where partner can be an empty recordset. """ - if number is None and partner: - number = partner.phone_get_sanitized_number() - sms = self.env['sms.sms'].sudo().search([ - ('partner_id', '=', partner.id), ('number', '=', number), - ('state', '=', 'canceled') - ]) + sms = self._find_sms_sms(partner, number, 'canceled') self.assertTrue(sms, 'SMS: not found canceled SMS for %s (number: %s)' % (partner, number)) self.assertEqual(sms.error_code, error_code) if content is not None: @@ -96,12 +113,7 @@ class SMSCase(MockSMS): def assertSMSFailed(self, partner, number, error_code, content=None): """ Check failed SMS. Search is done for a pair partner / number where partner can be an empty recordset. """ - if number is None and partner: - number = partner.phone_get_sanitized_number() - sms = self.env['sms.sms'].sudo().search([ - ('partner_id', '=', partner.id), ('number', '=', number), - ('state', '=', 'error') - ]) + sms = self._find_sms_sms(partner, number, 'error') self.assertTrue(sms, 'SMS: not found failed SMS for %s (number: %s)' % (partner, number)) self.assertEqual(sms.error_code, error_code) if content is not None: @@ -110,12 +122,7 @@ class SMSCase(MockSMS): def assertSMSOutgoing(self, partner, number, content=None): """ Check outgoing SMS. Search is done for a pair partner / number where partner can be an empty recordset. """ - if number is None and partner: - number = partner.phone_get_sanitized_number() - sms = self.env['sms.sms'].sudo().search([ - ('partner_id', '=', partner.id), ('number', '=', number), - ('state', '=', 'outgoing') - ]) + sms = self._find_sms_sms(partner, number, 'outgoing') self.assertTrue(sms, 'SMS: not found failed SMS for %s (number: %s)' % (partner, number)) if content is not None: self.assertEqual(sms.body, content) |
