def _test_restorer(stack, data): # We need to test the request's specific Registry. Initialize it here so we # can use it later (RegistryManager will re-use one preexisting in the # environ) registry = Registry() extra_environ={'paste.throw_errors': False, 'paste.registry': registry} request_id = restorer.get_request_id(extra_environ) app = TestApp(stack) res = app.get('/', extra_environ=extra_environ, expect_errors=True) # Ensure all the StackedObjectProxies are empty after the RegistryUsingApp # raises an Exception for stacked, proxied_obj, test_cleanup in data: only_key = list(proxied_obj.keys())[0] try: assert only_key not in stacked assert False except TypeError: # Definitely empty pass # Ensure the StackedObjectProxies & Registry 'work' in the simulated # EvalException context replace = {'replace': 'dict'} new = {'new': 'object'} restorer.restoration_begin(request_id) try: for stacked, proxied_obj, test_cleanup in data: # Ensure our original data magically re-appears in this context only_key, only_val = list(proxied_obj.items())[0] assert only_key in stacked and stacked[only_key] == only_val # Ensure the Registry still works registry.prepare() registry.register(stacked, new) assert 'new' in stacked and stacked['new'] == 'object' registry.cleanup() # Back to the original (pre-prepare()) assert only_key in stacked and stacked[only_key] == only_val registry.replace(stacked, replace) assert 'replace' in stacked and stacked['replace'] == 'dict' if test_cleanup: registry.cleanup() try: stacked._current_obj() assert False except TypeError: # Definitely empty pass finally: restorer.restoration_end()
def fake_request(pylons_config, server_name='mediadrop.example', language='en', method='GET', request_uri='/', post_vars=None): app_globals = pylons_config['pylons.app_globals'] pylons.app_globals._push_object(app_globals) if post_vars and method.upper() != 'POST': raise ValueError('You must not specify post_vars for request method %r' % method) wsgi_environ = create_wsgi_environ('http://%s%s' % (server_name, request_uri), method.upper(), request_body=post_vars) request = Request(wsgi_environ, charset='utf-8') request.language = language request.settings = app_globals.settings pylons.request._push_object(request) response = Response(content_type='application/xml', charset='utf-8') pylons.response._push_object(response) session = SessionObject(wsgi_environ) pylons.session._push_object(session) routes_url = URLGenerator(pylons_config['routes.map'], wsgi_environ) pylons.url._push_object(routes_url) # TODO: Use ContextObj() for Pylons 0.10 tmpl_context = AttribSafeContextObj() tmpl_context.paginators = Bunch() pylons.tmpl_context._push_object(tmpl_context) # some parts of Pylons (e.g. Pylons.controllers.core.WSGIController) # use the '.c' alias instead. pylons.c = pylons.tmpl_context paste_registry = Registry() paste_registry.prepare() engines = create_tw_engine_manager(app_globals) host_framework = PylonsHostFramework(engines=engines) paste_registry.register(tw.framework, host_framework) mediacore_i18n_path = os.path.join(os.path.dirname(mediacore.__file__), 'i18n') translator = Translator(language, dict(mediacore=mediacore_i18n_path)) # not sure why but sometimes pylons.translator is not a StackedObjectProxy # but just a regular Translator. if not hasattr(pylons.translator, '_push_object'): pylons.translator = StackedObjectProxy() paste_registry.replace(pylons.translator, translator) wsgi_environ.update({ 'pylons.pylons': pylons, 'paste.registry': paste_registry, }) return request