def test_02_image_upload_progress_unsplash(self): BASE_URL = self.base_url() def media_library_search(self, **params): return {"results": 0, "media": []} def fetch_unsplash_images(self, **post): return { 'total': 1434, 'total_pages': 48, 'results': [{ 'id': 'HQqIOc8oYro', 'alt_description': 'brown fox sitting on green grass field during daytime', 'urls': { # 'regular': 'https://images.unsplash.com/photo-1462953491269-9aff00919695?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMDUwOHwwfDF8c2VhcmNofDF8fGZveHxlbnwwfHx8fDE2MzEwMzIzNDE&ixlib=rb-1.2.1&q=80&w=1080', 'regular': BASE_URL + '/website/static/src/img/phone.png', }, 'links': { # 'download_location': 'https://api.unsplash.com/photos/HQqIOc8oYro/download?ixid=MnwzMDUwOHwwfDF8c2VhcmNofDF8fGZveHxlbnwwfHx8fDE2MzEwMzIzNDE' 'download_location': BASE_URL + '/website/static/src/img/phone.png', }, 'user': { 'name': 'Mitchell Admin', 'links': { 'html': BASE_URL, }, }, }] } # because not preprocessed by ControllerType metaclass fetch_unsplash_images.routing_type = 'json' Web_Unsplash.fetch_unsplash_images = http.route( "/web_unsplash/fetch_images", type='json', auth="user")(fetch_unsplash_images) # disable undraw, no third party should be called in tests media_library_search.routing_type = 'json' Web_Editor.media_library_search = http.route( ['/web_editor/media_library_search'], type='json', auth="user", website=True)(media_library_search) self.start_tour( self.env['website'].get_client_action_url('/test_image_progress'), 'test_image_upload_progress_unsplash', login="******")
def setUp(self): super().setUp() totp = None # might be possible to do client-side using `crypto.subtle` instead of # this horror show, but requires working on 64b integers, & BigInt is # significantly less well supported than crypto def totp_hook(self, secret=None): nonlocal totp if totp is None: totp = TOTP(secret) if secret: return totp.generate().token else: # on check, take advantage of window because previous token has been # "burned" so we can't generate the same, but tour is so fast # we're pretty certainly within the same 30s return totp.generate(time.time() + 30).token # because not preprocessed by ControllerType metaclass totp_hook.routing_type = 'json' self.env['ir.http']._clear_routing_map() # patch Home to add test endpoint Home.totp_hook = http.route('/totphook', type='json', auth='none')(totp_hook) # remove endpoint and destroy routing map @self.addCleanup def _cleanup(): del Home.totp_hook self.env['ir.http']._clear_routing_map()
def test_totp(self): totp = None # test endpoint as doing totp on the client side is not really an option # (needs sha1 and hmac + BE packing of 64b integers) def totp_hook(self, secret=None): nonlocal totp if totp is None: totp = TOTP(secret) if secret: return totp.generate().token else: # on check, take advantage of window because previous token has been # "burned" so we can't generate the same, but tour is so fast # we're pretty certainly within the same 30s return totp.generate(time.time() + 30).token # because not preprocessed by ControllerType metaclass totp_hook.routing_type = 'json' # patch Home to add test endpoint Home.totp_hook = http.route('/totphook', type='json', auth='none')(totp_hook) self.env['ir.http']._clear_routing_map() # remove endpoint and destroy routing map @self.addCleanup def _cleanup(): del Home.totp_hook self.env['ir.http']._clear_routing_map() self.start_tour('/my/security', 'totportal_tour_setup', login='******') # also disables totp otherwise we can't re-login self.start_tour('/', 'totportal_login_enabled', login=None) self.start_tour('/', 'totportal_login_disabled', login=None)
def _generate_methods(self): """Generate controller's methods and associated routes This method inspect the service definition and generate the appropriate methods and routing rules for all the methods decorated with @restappi.method :return: A dictionary of method name : method """ methods = {} _globals = {} root_path = self._base_controller._root_path path_sep = "" if root_path[-1] != "/": path_sep = "/" root_path = "{}{}{}".format(root_path, path_sep, self._service._usage) for name, method in _inspect_methods(self._service.__class__): if not hasattr(method, "routing"): continue routing = method.routing for routes, http_method in routing["routes"]: method_name = "{}_{}".format(http_method.lower(), name) default_route = routes[0] rule = Rule(default_route) Map(rules=[rule]) if rule.arguments: method = METHOD_TMPL_WITH_ARGS.format( method_name=method_name, service_name=self._service_name, service_method_name=name, args=", ".join(rule.arguments), ) else: method = METHOD_TMPL.format( method_name=method_name, service_name=self._service_name, service_method_name=name, ) exec(method, _globals) method_exec = _globals[method_name] route_params = dict( route=["{}{}".format(root_path, r) for r in routes], methods=[http_method], ) for attr in {"auth", "cors", "csrf", "save_session"}: if attr in routing: route_params[attr] = routing[attr] method_exec = http.route(**route_params)(method_exec) methods[method_name] = method_exec return methods