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.
 
 
 
 

95 lines
3.2 KiB

# Copyright 2018 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo.tests.common import SavepointCase
from odoo import fields
from base64 import urlsafe_b64encode
from datetime import datetime
from lxml import html
from werkzeug.urls import url_parse
from ..controllers.browser_view import EmailBrowserViewController
from mock import patch
class MailBrowserView(SavepointCase):
@classmethod
def setUpClass(cls):
super(MailBrowserView, cls).setUpClass()
cls.mail = cls.env['mail.mail']
cls.mail0 = cls.env.ref('mail_browser_view.browser_view_demo')
cls.valid_token = cls.mail0.view_in_browser_url.split('/')[-1]
def _forge_token(self, access_token, rec_id):
return urlsafe_b64encode(
(access_token + str(rec_id)).encode()
).decode()
def _test_token(self, token, expected_result):
rec = self.mail.get_record_for_token(token)
self.assertEqual(rec, expected_result)
def test_mail_browser_view(self):
self._test_token(self.valid_token, self.mail0)
def test_invalid_b64(self):
self._test_token(self.valid_token[::2], self.mail)
def test_invalid_access_token(self):
bad_token = self._forge_token('0000000', self.mail0.id)
self._test_token(bad_token, self.mail)
def test_nonexistent_id(self):
bad_token = self._forge_token(self.mail0.access_token, 999999)
self._test_token(bad_token, self.mail)
def test_token_expiration(self):
self.mail0.mail_message_id.date = fields.Datetime.to_string(
datetime.fromtimestamp(0)
)
self._test_token(self.valid_token, self.mail)
self.env.ref('mail_browser_view.token_expiration_hours').value = '0'
self.mail0.refresh()
self._test_token(self.valid_token, self.mail0)
def test_html_render(self):
html_node = html.fromstring(self.mail0.body_html)
link_node = html_node.xpath("//a[hasclass('view_in_browser_url')]")
self.assertEqual(
url_parse(link_node[0].get('href')).path,
self.mail0.view_in_browser_url
)
self.mail0.auto_delete = True
self.mail0._replace_view_url()
self.mail0.refresh()
html_node = html.fromstring(self.mail0.body_html)
link_node = html_node.xpath("//a[hasclass('view_in_browser_url')]")
self.assertEqual(link_node, [])
link_node = html_node.xpath(
"//a[not(hasclass('view_in_browser_url'))]"
)
self.assertEqual(len(link_node), 1)
self.assertEqual(link_node[0].get('href'), 'https://www.google.com')
p_node = html_node.xpath("//p")
self.assertEqual(len(p_node), 2)
@patch('odoo.addons.mail_browser_view.'
'controllers.browser_view.request')
def test_controller(self, req):
# Mock
req.env = self.env
controller = EmailBrowserViewController()
controller.email_view(self.valid_token[::2])
req.not_found.assert_called_once_with()
req.make_response.assert_not_called()
req.reset_mock()
controller.email_view(self.valid_token)
req.not_found.assert_not_called()
req.make_response.assert_called_with(self.mail0.body_html)