|
@ -1,9 +1,15 @@ |
|
|
# -*- coding: utf-8 -*- |
|
|
# -*- coding: utf-8 -*- |
|
|
# Copyright 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com> |
|
|
|
|
|
|
|
|
# Copyright 2016 Tecnativa - Antonio Espinosa |
|
|
|
|
|
# Copyright 2017 Tecnativa - David Vidal |
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
|
|
|
|
|
|
|
from odoo.tools import mute_logger |
|
|
from odoo.tools import mute_logger |
|
|
from odoo.tests.common import TransactionCase |
|
|
from odoo.tests.common import TransactionCase |
|
|
|
|
|
from odoo.exceptions import UserError, ValidationError |
|
|
|
|
|
import mock |
|
|
|
|
|
import json |
|
|
|
|
|
|
|
|
|
|
|
_packagepath = 'odoo.addons.mail_tracking_mailgun' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestMailgun(TransactionCase): |
|
|
class TestMailgun(TransactionCase): |
|
@ -26,12 +32,17 @@ class TestMailgun(TransactionCase): |
|
|
self.recipient = u'to@example.com' |
|
|
self.recipient = u'to@example.com' |
|
|
self.mail, self.tracking_email = self.mail_send() |
|
|
self.mail, self.tracking_email = self.mail_send() |
|
|
self.api_key = u'key-12345678901234567890123456789012' |
|
|
self.api_key = u'key-12345678901234567890123456789012' |
|
|
|
|
|
self.domain = u'example.com' |
|
|
self.token = u'f1349299097a51b9a7d886fcb5c2735b426ba200ada6e9e149' |
|
|
self.token = u'f1349299097a51b9a7d886fcb5c2735b426ba200ada6e9e149' |
|
|
self.timestamp = u'1471021089' |
|
|
self.timestamp = u'1471021089' |
|
|
self.signature = ('4fb6d4dbbe10ce5d620265dcd7a3c0b8' |
|
|
self.signature = ('4fb6d4dbbe10ce5d620265dcd7a3c0b8' |
|
|
'ca0dede1433103891bc1ae4086e9d5b2') |
|
|
'ca0dede1433103891bc1ae4086e9d5b2') |
|
|
self.env['ir.config_parameter'].set_param( |
|
|
self.env['ir.config_parameter'].set_param( |
|
|
'mailgun.apikey', self.api_key) |
|
|
'mailgun.apikey', self.api_key) |
|
|
|
|
|
self.env['ir.config_parameter'].set_param( |
|
|
|
|
|
'mail.catchall.domain', self.domain) |
|
|
|
|
|
self.env['ir.config_parameter'].set_param( |
|
|
|
|
|
'mailgun.validation_key', self.api_key) |
|
|
self.event = { |
|
|
self.event = { |
|
|
'Message-Id': u'<xxx.xxx.xxx-openerp-xxx-res.partner@test_db>', |
|
|
'Message-Id': u'<xxx.xxx.xxx-openerp-xxx-res.partner@test_db>', |
|
|
'X-Mailgun-Sid': u'WyIwNjgxZSIsICJ0b0BleGFtcGxlLmNvbSIsICI3MG' |
|
|
'X-Mailgun-Sid': u'WyIwNjgxZSIsICJ0b0BleGFtcGxlLmNvbSIsICI3MG' |
|
@ -51,6 +62,26 @@ class TestMailgun(TransactionCase): |
|
|
'os_family': False, |
|
|
'os_family': False, |
|
|
'ua_family': False, |
|
|
'ua_family': False, |
|
|
} |
|
|
} |
|
|
|
|
|
self.partner = self.env['res.partner'].create({ |
|
|
|
|
|
'name': 'Mr. Odoo', |
|
|
|
|
|
'email': 'mrodoo@example.com', |
|
|
|
|
|
}) |
|
|
|
|
|
self.response = { |
|
|
|
|
|
"items": [{ |
|
|
|
|
|
"log-level": "info", |
|
|
|
|
|
"id": "oXAVv5URCF-dKv8c6Sa7T", |
|
|
|
|
|
"timestamp": 1509119329.0, |
|
|
|
|
|
"message": { |
|
|
|
|
|
"headers": { |
|
|
|
|
|
"to": "test@test.com", |
|
|
|
|
|
"message-id": "test-id@f187c54734e8", |
|
|
|
|
|
"from": "Mr. Odoo <mrodoo@odoo.com>", |
|
|
|
|
|
"subject": "This is a test" |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
"event": "delivered" |
|
|
|
|
|
}] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
def event_search(self, event_type): |
|
|
def event_search(self, event_type): |
|
|
event = self.env['mail.tracking.event'].search([ |
|
|
event = self.env['mail.tracking.event'].search([ |
|
@ -63,6 +94,14 @@ class TestMailgun(TransactionCase): |
|
|
def test_no_api_key(self): |
|
|
def test_no_api_key(self): |
|
|
self.env['ir.config_parameter'].set_param('mailgun.apikey', '') |
|
|
self.env['ir.config_parameter'].set_param('mailgun.apikey', '') |
|
|
self.test_event_delivered() |
|
|
self.test_event_delivered() |
|
|
|
|
|
with self.assertRaises(ValidationError): |
|
|
|
|
|
self.env['mail.tracking.email']._mailgun_values() |
|
|
|
|
|
|
|
|
|
|
|
def test_no_domain(self): |
|
|
|
|
|
self.env['ir.config_parameter'].set_param('mail.catchall.domain', '') |
|
|
|
|
|
self.test_event_delivered() |
|
|
|
|
|
with self.assertRaises(ValidationError): |
|
|
|
|
|
self.env['mail.tracking.email']._mailgun_values() |
|
|
|
|
|
|
|
|
@mute_logger('odoo.addons.mail_tracking_mailgun.models' |
|
|
@mute_logger('odoo.addons.mail_tracking_mailgun.models' |
|
|
'.mail_tracking_email') |
|
|
'.mail_tracking_email') |
|
@ -288,3 +327,93 @@ class TestMailgun(TransactionCase): |
|
|
self.assertEqual(event.error_type, reason) |
|
|
self.assertEqual(event.error_type, reason) |
|
|
self.assertEqual(event.error_description, code) |
|
|
self.assertEqual(event.error_description, code) |
|
|
self.assertEqual(event.error_details, description) |
|
|
self.assertEqual(event.error_details, description) |
|
|
|
|
|
|
|
|
|
|
|
@mock.patch(_packagepath + '.models.res_partner.requests') |
|
|
|
|
|
def test_email_validity(self, mock_request): |
|
|
|
|
|
self.partner.email_bounced = False |
|
|
|
|
|
self.partner.email = 'info@tecnativa.com' |
|
|
|
|
|
mock_request.get.return_value.apparent_encoding = 'ascii' |
|
|
|
|
|
mock_request.get.return_value.status_code = 200 |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps({ |
|
|
|
|
|
'is_valid': True, |
|
|
|
|
|
'mailbox_verification': 'true', |
|
|
|
|
|
}, ensure_ascii=True) |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
self.assertFalse(self.partner.email_bounced) |
|
|
|
|
|
self.partner.email = 'xoxoxoxo@tecnativa.com' |
|
|
|
|
|
# Not a valid mailbox |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps({ |
|
|
|
|
|
'is_valid': True, |
|
|
|
|
|
'mailbox_verification': 'false', |
|
|
|
|
|
}, ensure_ascii=True) |
|
|
|
|
|
with self.assertRaises(UserError): |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
# Not a valid mail address |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps({ |
|
|
|
|
|
'is_valid': False, |
|
|
|
|
|
'mailbox_verification': 'false', |
|
|
|
|
|
}, ensure_ascii=True) |
|
|
|
|
|
with self.assertRaises(UserError): |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
# Unable to fully validate |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps({ |
|
|
|
|
|
'is_valid': True, |
|
|
|
|
|
'mailbox_verification': 'unknown', |
|
|
|
|
|
}, ensure_ascii=True) |
|
|
|
|
|
with self.assertRaises(UserError): |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
self.assertTrue(self.partner.email_bounced) |
|
|
|
|
|
|
|
|
|
|
|
@mock.patch(_packagepath + '.models.res_partner.requests') |
|
|
|
|
|
def test_email_validity_exceptions(self, mock_request): |
|
|
|
|
|
mock_request.get.return_value.status_code = 404 |
|
|
|
|
|
with self.assertRaises(UserError): |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
self.env['ir.config_parameter'].set_param('mailgun.validation_key', '') |
|
|
|
|
|
with self.assertRaises(UserError): |
|
|
|
|
|
self.partner.check_email_validity() |
|
|
|
|
|
|
|
|
|
|
|
@mock.patch(_packagepath + '.models.res_partner.requests') |
|
|
|
|
|
def test_bounced(self, mock_request): |
|
|
|
|
|
self.partner.email_bounced = True |
|
|
|
|
|
mock_request.get.return_value.status_code = 404 |
|
|
|
|
|
self.partner.check_email_bounced() |
|
|
|
|
|
self.assertFalse(self.partner.email_bounced) |
|
|
|
|
|
mock_request.get.return_value.status_code = 200 |
|
|
|
|
|
self.partner.force_set_bounced() |
|
|
|
|
|
self.partner.check_email_bounced() |
|
|
|
|
|
self.assertTrue(self.partner.email_bounced) |
|
|
|
|
|
mock_request.delete.return_value.status_code = 200 |
|
|
|
|
|
self.partner.force_unset_bounced() |
|
|
|
|
|
self.assertFalse(self.partner.email_bounced) |
|
|
|
|
|
|
|
|
|
|
|
def test_email_bounced_set(self): |
|
|
|
|
|
message_number = len(self.partner.message_ids) + 1 |
|
|
|
|
|
self.partner._email_bounced_set('test_error', self.event) |
|
|
|
|
|
self.assertEqual(len(self.partner.message_ids), message_number) |
|
|
|
|
|
self.partner.email = "" |
|
|
|
|
|
self.partner._email_bounced_set('test_error', self.event) |
|
|
|
|
|
self.assertEqual(len(self.partner.message_ids), message_number) |
|
|
|
|
|
|
|
|
|
|
|
@mock.patch(_packagepath + '.models.mail_tracking_email.requests') |
|
|
|
|
|
def test_manual_check(self, mock_request): |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps(self.response, |
|
|
|
|
|
ensure_ascii=True) |
|
|
|
|
|
mock_request.get.return_value.apparent_encoding = 'ascii' |
|
|
|
|
|
mock_request.get.return_value.status_code = 200 |
|
|
|
|
|
self.tracking_email.action_manual_check_mailgun() |
|
|
|
|
|
event = self.env['mail.tracking.event'].search( |
|
|
|
|
|
[('mailgun_id', '=', self.response['items'][0]['id'])]) |
|
|
|
|
|
self.assertEqual(event.event_type, self.response['items'][0]['event']) |
|
|
|
|
|
|
|
|
|
|
|
@mock.patch(_packagepath + '.models.mail_tracking_email.requests') |
|
|
|
|
|
def test_manual_check_exceptions(self, mock_request): |
|
|
|
|
|
mock_request.get.return_value.status_code = 404 |
|
|
|
|
|
with self.assertRaises(ValidationError): |
|
|
|
|
|
self.tracking_email.action_manual_check_mailgun() |
|
|
|
|
|
mock_request.get.return_value.status_code = 200 |
|
|
|
|
|
mock_request.get.return_value.content = json.dumps('{}', |
|
|
|
|
|
ensure_ascii=True) |
|
|
|
|
|
mock_request.get.return_value.apparent_encoding = 'ascii' |
|
|
|
|
|
with self.assertRaises(ValidationError): |
|
|
|
|
|
self.tracking_email.action_manual_check_mailgun() |