summaryrefslogtreecommitdiff
path: root/addons/website/tools.py
diff options
context:
space:
mode:
authorXavier Morel <xmo@odoo.com>2020-12-11 10:12:13 +0000
committerXavier Morel <xmo@odoo.com>2021-02-23 07:49:39 +0000
commit7a42cc19492ada223678b6b67fc85fb121155e2b (patch)
treefa07645fcd2d60c837029726287c0a7b6216e867 /addons/website/tools.py
parenta3f5d0b292361a4aa3af8e7662f74150c5d85254 (diff)
[IMP] website: mockify test
instead of using ad-hoc weirds closes odoo/odoo#66649 X-original-commit: 9a129ca95d80b12f6cf4bf65ff3b7fe4d0ac8cc7 Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
Diffstat (limited to 'addons/website/tools.py')
-rw-r--r--addons/website/tools.py119
1 files changed, 54 insertions, 65 deletions
diff --git a/addons/website/tools.py b/addons/website/tools.py
index fa1eee4f473..6930f8a5e68 100644
--- a/addons/website/tools.py
+++ b/addons/website/tools.py
@@ -1,11 +1,13 @@
# -*- encoding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-import odoo
+import contextlib
import re
+from unittest.mock import Mock, MagicMock, patch
+
import werkzeug
-from odoo.tools import DotDict
+import odoo
+from odoo.tools.misc import DotDict
def get_video_embed_code(video_url):
@@ -55,71 +57,58 @@ def get_video_embed_code(video_url):
return '<iframe class="embed-responsive-item" src="%s" allowFullScreen="true" frameborder="0"></iframe>' % embedUrl
-class MockObject(object):
- _log_call = []
-
- def __init__(self, *args, **kwargs):
- self.__dict__ = kwargs
-
- def __call__(self, *args, **kwargs):
- self._log_call.append((args, kwargs))
- return self
-
- def __getitem__(self, index):
- return self
-
-
def werkzeugRaiseNotFound(*args, **kwargs):
raise werkzeug.exceptions.NotFound()
-class MockRequest(object):
- """ Class with context manager mocking odoo.http.request for tests """
- def __init__(self, env, **kw):
- app = MockObject(routing={
+@contextlib.contextmanager
+def MockRequest(
+ env, *, routing=True, multilang=True,
+ context=None,
+ cookies=None, country_code=None, website=None, sale_order_id=None
+):
+ router = MagicMock()
+ match = router.return_value.bind.return_value.match
+ if routing:
+ match.return_value[0].routing = {
'type': 'http',
'website': True,
- 'multilang': kw.get('multilang', True),
- })
- app.get_db_router = app.bind = app.match = app
- if not kw.get('routing', True):
- app.match = werkzeugRaiseNotFound
-
- lang = kw.get('lang')
- if not lang:
- lang_code = kw.get('context', {}).get('lang', env.context.get('lang', 'en_US'))
- lang = env['res.lang']._lang_get(lang_code)
-
- context = kw.get('context', {})
- context.setdefault('lang', lang_code)
-
- self.request = DotDict({
- 'context': context,
- 'db': None,
- 'env': env,
- 'httprequest': {
- 'path': '/hello/',
- 'app': app,
- 'environ': {
- 'REMOTE_ADDR': '127.0.0.1',
- },
- 'cookies': kw.get('cookies', {}),
- },
- 'lang': lang,
- 'redirect': werkzeug.utils.redirect,
- 'session': {
- 'geoip': {
- 'country_code': kw.get('country_code'),
- },
- 'debug': False,
- 'sale_order_id': kw.get('sale_order_id'),
- },
- 'website': kw.get('website'),
- })
-
- def __enter__(self):
- odoo.http._request_stack.push(self.request)
- return self.request
-
- def __exit__(self, exc_type, exc_value, traceback):
- odoo.http._request_stack.pop()
+ 'multilang': multilang
+ }
+ else:
+ match.side_effect = werkzeugRaiseNotFound
+
+ if context is None:
+ context = {}
+ lang_code = context.get('lang', env.context.get('lang', 'en_US'))
+ context.setdefault('lang', lang_code)
+
+ request = Mock(
+ context=context,
+ db=None,
+ endpoint=match.return_value[0] if routing else None,
+ env=env,
+ httprequest=Mock(
+ host='localhost',
+ path='/hello/',
+ app=odoo.http.root,
+ environ={'REMOTE_ADDR': '127.0.0.1'},
+ cookies=cookies or {},
+ referrer='',
+ ),
+ lang=env['res.lang']._lang_get(lang_code),
+ redirect=werkzeug.utils.redirect,
+ session=DotDict(
+ geoip={'country_code': country_code},
+ debug=False,
+ sale_order_id=sale_order_id,
+ ),
+ website=website
+ )
+
+ with contextlib.ExitStack() as s:
+ odoo.http._request_stack.push(request)
+ s.callback(odoo.http._request_stack.pop)
+ s.enter_context(patch('odoo.http.root.get_db_router', router))
+
+ yield request