diff options
| author | Xavier Morel <xmo@odoo.com> | 2020-12-11 10:12:13 +0000 |
|---|---|---|
| committer | Xavier Morel <xmo@odoo.com> | 2021-02-23 07:49:39 +0000 |
| commit | 7a42cc19492ada223678b6b67fc85fb121155e2b (patch) | |
| tree | fa07645fcd2d60c837029726287c0a7b6216e867 /addons/website/tools.py | |
| parent | a3f5d0b292361a4aa3af8e7662f74150c5d85254 (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.py | 119 |
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 |
