You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

520 lines
21 KiB

# -*- coding: utf-8 -*-
# License AGPL-3: Antiun Ingenieria S.L. - Antonio Espinosa
# See README.rst file on addon root folder for more details
import json
from openerp.tests.common import TransactionCase
from openerp.tools.safe_eval import safe_eval
class TestMailMandrill(TransactionCase):
def setUp(self):
super(TestMailMandrill, self).setUp()
message_obj = self.env['mail.mandrill.message']
self.partner_01 = self.env.ref('base.res_partner_1')
self.partner_02 = self.env.ref('base.res_partner_2')
self.model = 'res.partner'
self.res_id = self.partner_02.id
self.mandrill_message_id = '0123456789abcdef0123456789abcdef'
self.event_deferral = {
'msg': {
'sender': 'username01@example.com',
'tags': [],
'smtp_events': [
{
'destination_ip': '123.123.123.123',
'diag': 'Event description',
'source_ip': '145.145.145.145',
'ts': 1455192896,
'type': 'deferred',
'size': 19513
},
],
'ts': 1455008558,
'clicks': [],
'resends': [],
'state': 'deferred',
'_version': '1abcdefghijkABCDEFGHIJ',
'template': None,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'opens': [],
'subject': 'My favorite subject'
},
'diag': '454 4.7.1 <username02@example.com>: Relay access denied',
'_id': self.mandrill_message_id,
'event': 'deferral',
'ts': 1455201028,
}
self.event_send = {
'msg': {
'_id': self.mandrill_message_id,
'subaccount': None,
'tags': [],
'smtp_events': [],
'ts': 1455201157,
'email': 'username02@example.com',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'state': 'sent',
'sender': 'username01@example.com',
'template': None,
'reject': None,
'resends': [],
'clicks': [],
'opens': [],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'send',
'ts': 1455201159,
}
self.event_hard_bounce = {
'msg': {
'bounce_description': 'bad_mailbox',
'sender': 'username01@example.com',
'tags': [],
'diag': 'smtp;550 5.4.1 [username02@example.com]: '
'Recipient address rejected: Access denied',
'smtp_events': [],
'ts': 1455194565,
'template': None,
'_version': 'abcdefghi123456ABCDEFG',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'resends': [],
'state': 'bounced',
'bgtools_code': 10,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'hard_bounce',
'ts': 1455195340
}
self.event_soft_bounce = {
'msg': {
'bounce_description': 'general',
'sender': 'username01@example.com',
'tags': [],
'diag': 'X-Notes; Error transferring to FQDN.EXAMPLE.COM\n ; '
'SMTP Protocol Returned a Permanent Error 550 5.7.1 '
'Unable to relay\n\n--==ABCDEFGHIJK12345678ABCDEFGH',
'smtp_events': [],
'ts': 1455194562,
'template': None,
'_version': 'abcdefghi123456ABCDEFG',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'resends': [],
'state': 'soft-bounced',
'bgtools_code': 40,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'soft_bounce',
'ts': 1455195622
}
self.event_open = {
'ip': '111.111.111.111',
'ts': 1455189075,
'location': {
'country_short': 'PT',
'city': 'Porto',
'country': 'Portugal',
'region': 'Porto',
'longitude': -8.61098957062,
'postal_code': '-',
'latitude': 41.1496086121,
'timezone': '+01:00',
},
'msg': {
'sender': 'username01@example.com',
'tags': [],
'smtp_events': [
{
'destination_ip': '222.222.222.222',
'diag': '250 2.0.0 ABCDEFGHIJK123456ABCDE mail '
'accepted for delivery',
'source_ip': '111.1.1.1',
'ts': 1455185877,
'type': 'sent',
'size': 30276,
},
],
'ts': 1455185876,
'clicks': [],
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'resends': [],
'state': 'sent',
'_version': 'abcdefghi123456ABCDEFG',
'template': None,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'opens': [
{
'ip': '111.111.111.111',
'ua': 'Windows/Windows 7/Outlook 2010/Outlook 2010',
'ts': 1455186247,
'location':
'Porto, PT'
}, {
'ip': '111.111.111.111',
'ua': 'Windows/Windows 7/Outlook 2010/Outlook 2010',
'ts': 1455189075,
'location': 'Porto, PT'
},
],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'user_agent_parsed': {
'ua_name': 'Outlook 2010',
'mobile': False,
'ua_company_url': 'http://www.microsoft.com/',
'os_icon': 'http://cdn.mandrill.com/img/email-client-icons/'
'windows-7.png',
'os_company': 'Microsoft Corporation.',
'ua_version': None,
'os_name': 'Windows 7',
'ua_family': 'Outlook 2010',
'os_url': 'http://en.wikipedia.org/wiki/Windows_7',
'os_company_url': 'http://www.microsoft.com/',
'ua_company': 'Microsoft Corporation.',
'os_family': 'Windows',
'type': 'Email Client',
'ua_icon': 'http://cdn.mandrill.com/img/email-client-icons/'
'outlook-2010.png',
'ua_url': 'http://en.wikipedia.org/wiki/Microsoft_Outlook',
},
'event': 'open',
'user_agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; '
'Trident/7.0; SLCC2; .NET CLR 2.0.50727; '
'.NET CLR 3.5.30729; .NET CLR 3.0.30729; '
'Media Center PC 6.0; .NET4.0C; .NET4.0E; BRI/2; '
'Tablet PC 2.0; GWX:DOWNLOADED; '
'Microsoft Outlook 14.0.7166; ms-office; '
'MSOffice 14)',
}
self.event_click = {
'url': 'http://www.example.com/index.php',
'ip': '111.111.111.111',
'ts': 1455186402,
'user_agent': 'Mozilla/5.0 (Windows NT 6.1) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/48.0.2564.103 Safari/537.36',
'msg': {
'sender': 'username01@example.com',
'tags': [],
'smtp_events': [
{
'destination_ip': '222.222.222.222',
'diag': '250 2.0.0 Ok: queued as 12345678',
'source_ip': '111.1.1.1',
'ts': 1455186065,
'type': 'sent',
'size': 30994,
},
],
'ts': 1455186063,
'clicks': [
{
'url': 'http://www.example.com/index.php',
'ip': '111.111.111.111',
'ua': 'Windows/Windows 7/Chrome/Chrome 48.0.2564.103',
'ts': 1455186402,
'location': 'Madrid, ES',
},
],
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'resends': [],
'state': 'sent',
'_version': 'abcdefghi123456ABCDEFG',
'template': None,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'opens': [
{
'ip': '111.111.111.111',
'ua': 'Windows/Windows 7/Chrome/Chrome 48.0.2564.103',
'ts': 1455186402,
'location': 'Madrid, ES',
},
],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'user_agent_parsed': {
'ua_name': 'Chrome 48.0.2564.103',
'mobile': False,
'ua_company_url': 'http://www.google.com/',
'os_icon': 'http://cdn.mandrill.com/img/email-client-icons/'
'windows-7.png',
'os_company': 'Microsoft Corporation.',
'ua_version': '48.0.2564.103',
'os_name': 'Windows 7',
'ua_family': 'Chrome',
'os_url': 'http://en.wikipedia.org/wiki/Windows_7',
'os_company_url': 'http://www.microsoft.com/',
'ua_company': 'Google Inc.',
'os_family': 'Windows',
'type': 'Browser',
'ua_icon': 'http://cdn.mandrill.com/img/email-client-icons/'
'chrome.png',
'ua_url': 'http://www.google.com/chrome',
},
'event': 'click',
'location': {
'country_short': 'ES',
'city': 'Madrid',
'country': 'Spain',
'region': 'Madrid',
'longitude': -3.70255994797,
'postal_code': '-',
'latitude': 40.4165000916,
'timezone': '+02:00',
},
}
self.event_spam = {
'msg': {
'sender': 'username01@example.com',
'tags': [],
'smtp_events': [],
'ts': 1455186007,
'clicks': [],
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'resends': [],
'state': 'spam',
'_version': 'abcdefghi123456ABCDEFG',
'template': None,
'_id': self.mandrill_message_id,
'email': 'username02@example.com',
'opens': [],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'spam',
'ts': 1455186366
}
self.event_reject = {
'msg': {
'_id': self.mandrill_message_id,
'subaccount': None,
'tags': [],
'smtp_events': [],
'ts': 1455194291,
'email': 'username02@example.com',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'state': 'rejected',
'sender': 'username01@example.com',
'template': None,
'reject': None,
'resends': [],
'clicks': [],
'opens': [],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'reject',
'ts': 1455194291,
}
self.event_unsub = {
'msg': {
'_id': self.mandrill_message_id,
'subaccount': None,
'tags': [],
'smtp_events': [],
'ts': 1455194291,
'email': 'username02@example.com',
'metadata': {
'odoo_id': self.res_id,
'odoo_db': 'test',
'odoo_model': self.model,
},
'state': 'unsub',
'sender': 'username01@example.com',
'template': None,
'reject': None,
'resends': [],
'clicks': [],
'opens': [],
'subject': 'My favorite subject',
},
'_id': self.mandrill_message_id,
'event': 'unsub',
'ts': 1455194291,
}
self.message = message_obj.create(
message_obj._message_prepare(
self.mandrill_message_id, 'deferral', self.event_deferral))
# Test Unit: mail_mail.py
def test_mandrill_headers_add(self):
mail_obj = self.env['mail.mail']
message = self.env['mail.message'].create({
'author_id': self.partner_01.id,
'subject': 'Test subject',
'body': 'Test body',
'partner_ids': [(4, self.partner_02.id)],
'model': self.model,
'res_id': self.res_id,
})
mail = mail_obj.create({
'mail_message_id': message.id,
})
mail._mandrill_headers_add()
headers = safe_eval(mail.headers)
self.assertIn('X-MC-Metadata', headers)
metadata = json.loads(headers.get('X-MC-Metadata', '[]'))
self.assertIn('odoo_db', metadata)
self.assertIn('odoo_model', metadata)
self.assertIn('odoo_id', metadata)
self.assertEqual(metadata['odoo_model'], self.model)
self.assertEqual(metadata['odoo_id'], self.res_id)
# Test Unit: mail_mandrill_message.py
def test_message_prepare(self):
data = self.env['mail.mandrill.message']._message_prepare(
self.mandrill_message_id, 'deferral', self.event_deferral)
self.assertEqual(data['mandrill_id'], self.mandrill_message_id)
self.assertEqual(data['timestamp'],
self.event_deferral['msg']['ts'])
self.assertEqual(data['recipient'],
self.event_deferral['msg']['email'])
self.assertEqual(data['sender'],
self.event_deferral['msg']['sender'])
self.assertEqual(data['name'],
self.event_deferral['msg']['subject'])
def test_event_prepare(self):
data = self.env['mail.mandrill.message']._event_prepare(
self.message, 'deferral', self.event_deferral)
self.assertEqual(self.message.state, 'deferred')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'deferral')
self.assertEqual(data['timestamp'], self.event_deferral['ts'])
def test_process(self):
event = self.env['mail.mandrill.message'].process(
self.mandrill_message_id, 'deferral', self.event_deferral)
self.assertEqual(event.message_id.mandrill_id,
self.mandrill_message_id)
self.assertEqual(event.message_id.state, 'deferred')
self.assertEqual(event.event_type, 'deferral')
self.assertEqual(event.timestamp, self.event_deferral['ts'])
# Test Unit: mail_mandrill_event.py
def test_process_send(self):
data = self.env['mail.mandrill.event'].process_send(
self.message, self.event_send)
self.assertEqual(self.message.state, 'sent')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'send')
self.assertEqual(data['timestamp'], self.event_send['ts'])
def test_process_deferral(self):
data = self.env['mail.mandrill.event'].process_deferral(
self.message, self.event_deferral)
self.assertEqual(self.message.state, 'deferred')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'deferral')
self.assertEqual(data['timestamp'], self.event_deferral['ts'])
def test_process_hard_bounce(self):
data = self.env['mail.mandrill.event'].process_hard_bounce(
self.message, self.event_hard_bounce)
self.assertEqual(self.message.state, 'bounced')
self.assertEqual(self.message.bounce_type,
self.event_hard_bounce['msg']['bounce_description'])
self.assertEqual(self.message.bounce_description,
self.event_hard_bounce['msg']['diag'])
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'hard_bounce')
self.assertEqual(data['timestamp'], self.event_hard_bounce['ts'])
def test_process_soft_bounce(self):
data = self.env['mail.mandrill.event'].process_soft_bounce(
self.message, self.event_soft_bounce)
self.assertEqual(self.message.state, 'bounced')
self.assertEqual(self.message.bounce_type,
self.event_soft_bounce['msg']['bounce_description'])
self.assertEqual(self.message.bounce_description,
self.event_soft_bounce['msg']['diag'])
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'soft_bounce')
self.assertEqual(data['timestamp'], self.event_soft_bounce['ts'])
def test_process_open(self):
data = self.env['mail.mandrill.event'].process_open(
self.message, self.event_open)
self.assertEqual(self.message.state, 'opened')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'open')
self.assertEqual(data['timestamp'], self.event_open['ts'])
self.assertEqual(data['ip'], self.event_open['ip'])
def test_process_click(self):
data = self.env['mail.mandrill.event'].process_click(
self.message, self.event_open)
self.assertEqual(self.message.state, 'opened')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'click')
self.assertEqual(data['timestamp'], self.event_open['ts'])
self.assertEqual(data['ip'], self.event_open['ip'])
def test_process_spam(self):
data = self.env['mail.mandrill.event'].process_spam(
self.message, self.event_spam)
self.assertEqual(self.message.state, 'spam')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'spam')
self.assertEqual(data['timestamp'], self.event_spam['ts'])
def test_process_reject(self):
data = self.env['mail.mandrill.event'].process_reject(
self.message, self.event_reject)
self.assertEqual(self.message.state, 'rejected')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'reject')
self.assertEqual(data['timestamp'], self.event_reject['ts'])
def test_process_unsub(self):
data = self.env['mail.mandrill.event'].process_unsub(
self.message, self.event_unsub)
self.assertEqual(self.message.state, 'unsub')
self.assertEqual(data['message_id'], self.message.id)
self.assertEqual(data['event_type'], 'unsub')
self.assertEqual(data['timestamp'], self.event_unsub['ts'])