def test_dedicated_controller_wrapper(self): milestones._reset_all() class RootController(TGController): @expose() def test(self): return 'HI!' wrapper_has_been_visited = [] def controller_wrapper(app_config, caller): def call(*args, **kw): wrapper_has_been_visited.append(True) return caller(*args, **kw) return call conf = AppConfig(minimal=True, root_controller=RootController()) tg.hooks.wrap_controller(controller_wrapper, controller=RootController.test) conf.package = PackageWithModel() app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') assert wrapper_has_been_visited[0] is True
def __init__(self, folder, values=None): if values is None: values = {} AppConfig.__init__(self) # First we setup some base values that we know will work self.renderers = ['genshi', 'mako', 'jinja', 'json', 'jsonp', 'kajiki'] self.render_functions = tg.util.Bunch() self.package = tests.test_stack self.default_renderer = 'genshi' self.globals = self self.auth_backend = None self.auto_reload_templates = False self.use_legacy_renderer = False self.use_dotted_templatenames = False self.serve_static = False self['errorpage.enabled'] = False root = os.path.dirname(os.path.dirname(tests.__file__)) test_base_path = os.path.join( root, 'tests', 'test_stack', ) test_config_path = os.path.join(test_base_path, folder) self.paths = tg.util.Bunch( root=test_base_path, controllers=os.path.join(test_config_path, 'controllers'), static_files=os.path.join(test_config_path, 'public'), templates=[os.path.join(test_config_path, 'templates')], i18n=os.path.join(test_config_path, 'i18n')) # then we override those values with what was passed in for key, value in values.items(): setattr(self, key, value)
def test_render_default(): conf = AppConfig(minimal=True) conf.default_renderer = 'json' app = conf.make_wsgi_app() res = tg.render_template({'value': 'value'}) assert 'value": "value' in res
def test_custom_error_document_with_streamed_response(self): class ErrorController(TGController): @expose() def document(self, *args, **kw): return 'ERROR!!!' class RootController(TGController): error = ErrorController() @expose() def test(self): response.status_code = 403 def _output(): yield 'Hi' yield 'World' return _output() conf = AppConfig(minimal=True, root_controller=RootController()) conf.handle_error_page = True app = conf.make_wsgi_app(full_stack=True) app = TestApp(app) resp = app.get('/test', status=403) assert 'ERROR!!!' in resp, resp
def __init__(self, folder, values=None): if values is None: values = {} AppConfig.__init__(self) # First we setup some base values that we know will work self.renderers = ["genshi", "mako", "jinja", "json", "jsonp", "kajiki"] self.render_functions = tg.util.Bunch() self.package = tests.test_stack self.default_renderer = "genshi" self.globals = self self.auth_backend = None self.auto_reload_templates = False self.use_legacy_renderer = False self.use_dotted_templatenames = False self.serve_static = False self["errorpage.enabled"] = False root = os.path.dirname(os.path.dirname(tests.__file__)) test_base_path = os.path.join(root, "tests", "test_stack") test_config_path = os.path.join(test_base_path, folder) self.paths = tg.util.Bunch( root=test_base_path, controllers=os.path.join(test_config_path, "controllers"), static_files=os.path.join(test_config_path, "public"), templates=[os.path.join(test_config_path, "templates")], i18n=os.path.join(test_config_path, "i18n"), ) # then we override those values with what was passed in for key, value in values.items(): setattr(self, key, value)
def __init__(self, folder, values=None): if values is None: values = {} AppConfig.__init__(self) #First we setup some base values that we know will work self.renderers = ['genshi', 'mako', 'jinja','json'] if not PY3: self.renderers.extend(['chameleon_genshi', 'kajiki']) self.render_functions = tg.util.Bunch() self.package = tests.test_stack self.default_renderer = 'genshi' self.globals = self self.auth_backend = None self.auto_reload_templates = False self.use_legacy_renderer = False self.use_dotted_templatenames = False self.serve_static = False root = os.path.dirname(os.path.dirname(tests.__file__)) test_base_path = os.path.join(root,'tests', 'test_stack',) test_config_path = os.path.join(test_base_path, folder) self.paths=tg.util.Bunch( root=test_base_path, controllers=os.path.join(test_config_path, 'controllers'), static_files=os.path.join(test_config_path, 'public'), templates=[os.path.join(test_config_path, 'templates')], i18n=os.path.join(test_config_path, 'i18n') ) # then we override those values with what was passed in for key, value in values.items(): setattr(self, key, value)
def __init__(self, folder, values=None): AppConfig.__init__(self) #First we setup some base values that we know will work self.renderers = ['genshi', 'mako', 'chameleon_genshi', 'jinja'] self.render_functions = tg.util.Bunch() self.package = tg.test_stack self.default_renderer = 'genshi' self.globals = self self.helpers = {} self.auth_backend = None self.auto_reload_templates = False self.use_legacy_renderer = False self.use_dotted_templatenames = False self.serve_static = False root = "." test_base_path = os.path.join( root, 'tg', 'test_stack', ) test_config_path = os.path.join(test_base_path, folder) self.paths = tg.util.Bunch( root=test_base_path, controllers=os.path.join(test_config_path, 'controllers'), static_files=os.path.join(test_config_path, 'public'), templates=[os.path.join(test_config_path, 'templates')]) #Then we overide those values with what was passed in for key, value in values.items(): setattr(self, key, value)
def test_disconnect_hooks_multiple_listener(self): hook1_has_been_called = [] def hook1_listener(): hook1_has_been_called.append(True) hook2_has_been_called = [] def hook2_listener(): hook2_has_been_called.append(True) class RootController(TGController): @expose() def test(self): tg.hooks.notify('custom_hook', controller=RootController.test) return 'HI!' conf = AppConfig(minimal=True, root_controller=RootController()) tg.hooks.register('custom_hook', hook1_listener) tg.hooks.register('custom_hook', hook2_listener) conf.package = PackageWithModel() app = conf.make_wsgi_app() app = TestApp(app) app.get('/test') app.get('/test') tg.hooks.disconnect('custom_hook', hook2_listener) app.get('/test') # Disconnecting an unregistered hook should do nothing. tg.hooks.disconnect('unregistered', hook1_listener) assert len(hook1_has_been_called) == 3, hook1_has_been_called assert len(hook2_has_been_called) == 2, hook2_has_been_called
def setup(self): conf = AppConfig(minimal=True) conf.use_dotted_templatenames = True conf.renderers.append('mako') conf.package = FakePackage() self.conf = conf self.app = conf.make_wsgi_app()
def test_mixed_controller_wrapper(self): milestones._reset_all() class RootController(TGController): @expose() def test(self): return 'HI!' app_wrapper_has_been_visited = [] def app_controller_wrapper(app_config, caller): def call(*args, **kw): app_wrapper_has_been_visited.append(True) return caller(*args, **kw) return call wrapper_has_been_visited = [] def controller_wrapper(app_config, caller): def call(*args, **kw): wrapper_has_been_visited.append(True) return caller(*args, **kw) return call conf = AppConfig(minimal=True, root_controller=RootController()) tg.hooks.wrap_controller(app_controller_wrapper) tg.hooks.wrap_controller(controller_wrapper, controller=RootController.test) conf.package = PackageWithModel() app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') assert wrapper_has_been_visited[0] is True assert app_wrapper_has_been_visited[0] is True
def setup(self): conf = AppConfig(minimal=True) conf.use_dotted_templatenames = True conf.renderers.append('kajiki') conf.package = FakePackage() self.conf = conf self.app = TestApp(conf.make_wsgi_app()) self.render = self.conf.render_functions['kajiki']
def test_package_no_app_globals(self): class RootController(TGController): pass conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = sys.modules[__name__] app = conf.make_wsgi_app()
def test_application_test_vars(self): conf = AppConfig(minimal=True, root_controller=None) conf.package = PackageWithModel() app = conf.make_wsgi_app(global_conf={'debug': True}) app = TestApp(app) assert 'DONE' in app.get('/_test_vars') assert request.path == '/_test_vars'
def test_application_test_vars(self): conf = AppConfig(minimal=True, root_controller=None) conf.package = PackageWithModel() app = conf.make_wsgi_app(global_conf={'debug':True}) app = TestApp(app) assert 'DONE' in app.get('/_test_vars') assert request.path == '/_test_vars'
def test_setup_jinja_without_package(self): class RootController(TGController): @expose() def test(self): return 'HI!' conf = AppConfig(minimal=True, root_controller=RootController()) conf.renderers = ['jinja'] app = conf.make_wsgi_app()
def setup(self): class RootController(TGController): @expose() def test(self): return str(bool(EqualsTwo())) conf = AppConfig(minimal=True, root_controller=RootController()) app = conf.make_wsgi_app() self.app = TestApp(app)
def test_application_wrapper_blocked_after_milestone(self): class AppWrapper1: pass class AppWrapper2: pass conf = AppConfig(minimal=True) conf.register_wrapper(AppWrapper1) milestones.environment_loaded.reach() conf.register_wrapper(AppWrapper2)
def __init__(self, root_controller='root'): AppConfig.__init__(self) self.root_controller = root_controller self.package = allura self.renderers = ['json', 'genshi', 'mako', 'jinja'] self.default_renderer = 'genshi' self.use_sqlalchemy = False self.use_toscawidgets = True self.use_transaction_manager = False self.handle_status_codes = [403, 404] self.disable_request_extensions = True
def test_application_empty_controller(self): class RootController(object): def __call__(self, environ, start_response): return None conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = PackageWithModel() app = conf.make_wsgi_app(global_conf={'debug': True}) app = TestApp(app) r = app.get('/something', status=500) assert 'No content returned by controller' in r
def setup(self): conf = AppConfig(minimal=True, root_controller=i18nRootController()) conf['paths']['root'] = 'tests' conf['i18n_enabled'] = True conf['use_sessions'] = True conf['beaker.session.key'] = 'tg_test_session' conf['beaker.session.secret'] = 'this-is-some-secret' conf.renderers = ['json'] conf.default_renderer = 'json' conf.package = _FakePackage() app = conf.make_wsgi_app() self.app = TestApp(app)
def test_enable_routes(self): if PY3: raise SkipTest() conf = AppConfig(minimal=True) conf.enable_routes = True app = conf.make_wsgi_app() a = TGApp() assert a.enable_routes == True config.pop('routes.map') config.pop('enable_routes')
def test_setup_ming_persistance_with_url_alone(self): if PY3: raise SkipTest() package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=None) conf.package = package conf.model = package.model conf.use_ming = True conf['ming.url'] = 'mim://inmemdb' app = conf.make_wsgi_app() assert app is not None
def test_application_empty_controller(self): class RootController(object): def __call__(self, environ, start_response): return None conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = PackageWithModel() app = conf.make_wsgi_app(global_conf={'debug':True}) app = TestApp(app) r = app.get('/something', status=500) assert 'No content returned by controller' in r
def test_create_minimal_app(self): class RootController(TGController): @expose() def test(self): return 'HI!' conf = AppConfig(minimal=True, root_controller=RootController()) app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') #This is here to avoid that other tests keep using the forced controller config.pop('tg.root_controller')
def test_startup_hook_with_exception(self): # Temporary replace the hooks namespace so we register hooks only for this test original_hooks, tg.hooks = tg.hooks, _TGGlobalHooksNamespace() try: def func(): raise Exception tg.hooks.register('startup', func) conf = AppConfig(minimal=True) app = conf.make_wsgi_app() finally: tg.hooks = original_hooks
def test_jinja_lookup_nonexisting_template(): conf = AppConfig(minimal=True) conf.use_dotted_templatenames = True conf.renderers.append('jinja') conf.package = FakePackage() app = conf.make_wsgi_app() from jinja2 import TemplateNotFound try: render_jinja('tg.this_template_does_not_exists', {'app_globals':tg.config['tg.app_globals']}) assert False except TemplateNotFound: pass
def test_setup_ming_persistance_advanced_options(self): if PY3: raise SkipTest() package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=None) conf.package = package conf.model = package.model conf.use_ming = True conf['ming.url'] = 'mim://inmemdb' conf['ming.connection.read_preference'] = 'PRIMARY' app = conf.make_wsgi_app() assert app is not None
def test_jinja_lookup_nonexisting_template(): conf = AppConfig(minimal=True) conf.use_dotted_templatenames = True conf.renderers.append('jinja') conf.package = FakePackage() app = conf.make_wsgi_app() from jinja2 import TemplateNotFound try: render_jinja('tg.this_template_does_not_exists', {'app_globals': tg.config['tg.app_globals']}) assert False except TemplateNotFound: pass
def test_config_hooks(self): class RootController(TGController): @expose() def test(self): return 'HI!' visited_hooks = [] def before_config_hook(app): visited_hooks.append('before_config') return app def after_config_hook(app): visited_hooks.append('after_config') return app def configure_new_app_hook(app): assert isinstance(app, TGApp) visited_hooks.append('configure_new_app') conf = AppConfig(minimal=True, root_controller=RootController()) conf.register_hook('before_config', before_config_hook) conf.register_hook('after_config', after_config_hook) conf.register_hook('configure_new_app', configure_new_app_hook) app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') assert 'before_config' in visited_hooks assert 'after_config' in visited_hooks assert 'configure_new_app' in visited_hooks
def test_serve_statics(self): class RootController(TGController): @expose() def test(self): return 'HI!' conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = PackageWithModel() conf.serve_static = True app = conf.make_wsgi_app() assert app.__class__.__name__.startswith('Statics') app = TestApp(app) assert 'HI!' in app.get('/test')
def test_sqla_auth_logging_stderr(self): past_config_sa_auth = config.sa_auth config.sa_auth = {} package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=None) conf.package = package conf.model = package.model conf.auth_backend = 'sqlalchemy' conf.use_sqlalchemy = True conf['sqlalchemy.url'] = 'sqlite://' alwaysadmin = _AuthenticationForgerPlugin(fake_user_key='FAKE_USER') conf['sa_auth'] = {'authmetadata': ApplicationAuthMetadata(), 'cookie_secret':'12345', 'form_plugin':alwaysadmin, 'log_level':'DEBUG', 'authenticators':UncopiableList([('alwaysadmin', alwaysadmin)]), 'identifiers':[('alwaysadmin', alwaysadmin)], 'challengers':[]} conf['sa_auth']['log_file'] = 'stderr' app = conf.make_wsgi_app() conf['sa_auth']['log_file'] = 'stdout' app = conf.make_wsgi_app() import tempfile f = tempfile.NamedTemporaryFile() conf['sa_auth']['log_file'] = f.name app = conf.make_wsgi_app() self.config['sa_auth'] = {} self.config.auth_backend = None config.sa_auth = past_config_sa_auth
def test_error_middleware_disabled_with_optimize(self): class RootController(TGController): @expose() def test(self): return 'HI!' conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = PackageWithModel() os.environ['PYTHONOPTIMIZE'] = '2' app = conf.make_wsgi_app() os.environ.pop('PYTHONOPTIMIZE') app = TestApp(app) assert 'HI!' in app.get('/test')
def test_mount_point_with_minimal(self): class SubController(TGController): @expose() def test(self): return self.mount_point class RootController(TGController): sub = SubController() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = PackageWithModel() app = conf.make_wsgi_app() app = TestApp(app) assert '/sub' in app.get('/sub/test')
def test_backward_compatible_engine_failed_setup(self): class RootController(TGController): @expose() def test(self, *args, **kwargs): return 'HELLO' def setup_broken_renderer(): return False conf = AppConfig(minimal=True, root_controller=RootController()) conf.setup_broken_renderer = setup_broken_renderer conf.renderers = ['json', 'broken'] app = conf.make_wsgi_app(full_stack=True) assert conf.renderers == ['json']
def test_startup_hook(self): # Temporary replace the hooks namespace so we register hooks only for this test original_hooks, tg.hooks = tg.hooks, _TGGlobalHooksNamespace() try: executed = [] def func(): executed.append(True) tg.hooks.register('startup', func) conf = AppConfig(minimal=True) app = conf.make_wsgi_app() assert True in executed, executed finally: tg.hooks = original_hooks
def test_sqlalchemy_commit_veto(self): class RootController(TGController): @expose() def test(self): return 'HI!' @expose() def crash(self): raise Exception('crash') @expose() def forbidden(self): response.status = 403 return 'FORBIDDEN' @expose() def notfound(self): response.status = 404 return 'NOTFOUND' def custom_commit_veto(environ, status, headers): if status.startswith('404'): return True return False fake_transaction = FakeTransaction() import transaction prev_transaction_manager = transaction.manager transaction.manager = fake_transaction package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = package conf.model = package.model conf.use_sqlalchemy = True conf.use_transaction_manager = True conf['sqlalchemy.url'] = 'sqlite://' conf.commit_veto = custom_commit_veto app = conf.make_wsgi_app() app = TestApp(app) app.get('/test') assert fake_transaction.aborted == False try: app.get('/crash') except: pass assert fake_transaction.aborted == True app.get('/forbidden', status=403) assert fake_transaction.aborted == False app.get('/notfound', status=404) assert fake_transaction.aborted == True transaction.manager = prev_transaction_manager
def __init__(self, root_controller=None): AppConfig.__init__(self, minimal=True, root_controller=root_controller) self.package = allura self.renderers = ['json', 'mako', 'jinja'] self.default_renderer = 'jinja' self.register_rendering_engine(AlluraJinjaRenderer) self.use_sqlalchemy = False self.use_toscawidgets = False self.use_transaction_manager = False self.handle_status_codes = [403, 404] self.disable_request_extensions = True # if left to True (default) would use crank.util.default_path_translator to convert all URL punctuation to "_" # which is convenient for /foo-bar to execute a "def foo_bar" method, but is a pretty drastic change for us # and makes many URLs be valid that we might not want like /foo*bar /foo@bar /foo:bar self.dispatch_path_translator = None
def __init__(self, root_controller=None): AppConfig.__init__(self, minimal=True, root_controller=root_controller) self.package = allura self.renderers = ['json', 'genshi', 'mako', 'jinja'] self.default_renderer = 'jinja' self.register_rendering_engine(AlluraJinjaRenderer) self.use_sqlalchemy = False self.use_toscawidgets = False self.use_transaction_manager = False self.handle_status_codes = [403, 404] self.disable_request_extensions = True # if left to True (default) would use crank.util.default_path_translator to convert all URL punctuation to "_" # which is convenient for /foo-bar to execute a "def foo_bar" method, but is a pretty drastic change for us # and makes many URLs be valid that we might not want like /foo*bar /foo@bar /foo:bar self.dispatch_path_translator = None
def test_setup_sqlalchemy(self): class RootController(TGController): @expose() def test(self): return 'HI!' package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = package conf.model = package.model conf.use_sqlalchemy = True conf['sqlalchemy.url'] = 'sqlite://' app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') assert package.model.DBSession.DBSESSION_REMOVED
def test_config_hooks(self): class RootController(TGController): @expose() def test(self): return 'HI!' visited_hooks = [] def before_config_hook(app): visited_hooks.append('before_config') return app def after_config_hook(app): visited_hooks.append('after_config') return app conf = AppConfig(minimal=True, root_controller=RootController()) conf.register_hook('before_config', before_config_hook) conf.register_hook('after_config', after_config_hook) app = conf.make_wsgi_app() app = TestApp(app) assert 'HI!' in app.get('/test') assert 'before_config' in visited_hooks assert 'after_config' in visited_hooks
def test_sqlalchemy_doom(self): fake_transaction = FakeTransaction() import transaction prev_transaction_manager = transaction.manager transaction.manager = fake_transaction class RootController(TGController): @expose() def test(self): fake_transaction.doom() return 'HI!' package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = package conf.model = package.model conf.use_sqlalchemy = True conf.use_transaction_manager = True conf['sqlalchemy.url'] = 'sqlite://' app = conf.make_wsgi_app() app = TestApp(app) app.get('/test') assert fake_transaction.aborted == True transaction.manager = prev_transaction_manager
def test_sqlalchemy_retry(self): fake_transaction = FakeTransaction() import transaction prev_transaction_manager = transaction.manager transaction.manager = fake_transaction from transaction.interfaces import TransientError class RootController(TGController): attempts = [] @expose() def test(self): self.attempts.append(True) if len(self.attempts) == 3: return 'HI!' raise TransientError() package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = package conf.model = package.model conf.use_sqlalchemy = True conf.use_transaction_manager = True conf['sqlalchemy.url'] = 'sqlite://' conf['tm.attempts'] = 3 app = conf.make_wsgi_app() app = TestApp(app) resp = app.get('/test') assert 'HI' in resp transaction.manager = prev_transaction_manager
def test_setup_sqla_auth(self): if PY3: raise SkipTest() class RootController(TGController): @expose() def test(self): return str(request.environ) package = PackageWithModel() conf = AppConfig(minimal=True, root_controller=RootController()) conf.package = package conf.model = package.model conf.auth_backend = 'sqlalchemy' conf.use_sqlalchemy = True conf['sa_auth'] = { 'authmetadata': ApplicationAuthMetadata(), 'dbsession': None, 'user_class': None, 'cookie_secret': '12345' } conf['sqlalchemy.url'] = 'sqlite://' app = conf.make_wsgi_app() app = TestApp(app) assert 'repoze.who.plugins' in app.get('/test') self.config.auth_backend = None
def test_backward_compatible_engine_success_setup(self): class RootController(TGController): @expose() def test(self, *args, **kwargs): return 'HELLO' conf = AppConfig(minimal=True, root_controller=RootController()) def setup_broken_renderer(): conf.render_functions.broken = 'BROKEN' return True conf.setup_broken_renderer = setup_broken_renderer conf.renderers = ['json', 'broken'] app = conf.make_wsgi_app(full_stack=True) assert conf.renderers == ['json', 'broken'] assert conf.render_functions.broken == 'BROKEN'
def __init__(self): AppConfig.__init__(self) self.renderers = ['json', 'genshi', 'mako'] tg.config['renderers'] = ['json', 'genshi', 'mako'] self.render_functions = tg.util.Bunch() self.package = tests #self.default_renderer = 'genshi' self.globals = self self.helpers = {} self.auth_backend = None self.auto_reload_templates = False self.use_legacy_renderer = False self.use_dotted_templatenames = False self.use_sqlalchemy=True self.serve_static = False self.prefer_toscawidgets2 = True self['templating.genshi.name_constant_patch'] = True root = os.path.dirname(os.path.dirname(tests.__file__)) test_base_path = os.path.join(root, 'tests') test_config_path = test_base_path #os.path.join(test_base_path, folder) self.paths=tg.util.Bunch( root=test_base_path, controllers=os.path.join(test_config_path, 'controllers'), static_files=os.path.join(test_config_path, 'public'), templates=[os.path.join(test_config_path, 'templates')], i18n=os.path.join(test_config_path, 'i18n') ) #xxx: why not use memory db? values = { 'sqlalchemy.url':'sqlite:///'+root+'/test.db', 'session':tests.model.DBSession, 'model':tests.model, 'use_dotted_templatenames': True, 'renderers': ['json', 'genshi', 'mako'] } #Then we overide those values with what was passed in for key, value in values.items(): setattr(self, key, value)
def test_application_no_controller_hijacking(self): class RootController(TGController): @expose() def test(self): return 'HI!' class AppWrapper(object): def __init__(self, dispatcher): self.dispatcher = dispatcher def __call__(self, controller, environ, start_response): return self.dispatcher(None, environ, start_response) conf = AppConfig(minimal=True, root_controller=RootController()) conf.application_wrappers.append(AppWrapper) conf.package = PackageWithModel() app = conf.make_wsgi_app() app = TestApp(app) app.get('/test', status=404)
def test_custom_error_document(self): class ErrorController(TGController): @expose() def document(self, *args, **kw): return 'ERROR!!!' class RootController(TGController): error = ErrorController() @expose() def test(self): abort(403) conf = AppConfig(minimal=True, root_controller=RootController()) conf.handle_error_page = True app = conf.make_wsgi_app(full_stack=True) app = TestApp(app) resp = app.get('/test', status=403) assert 'ERROR!!!' in resp, resp
def setup(self): self.config = AppConfig() # set up some required paths and config settings # FIXME: these seem to be needed so that # other tests don't suffer - but that's a nasty # side-effect. setup for those tests actually needs # fixing. self.config.package = self.fake_package self.config['paths']['root'] = 'test' self.config['paths']['controllers'] = 'test.controllers' self.config.init_config({'cache_dir': '/tmp'}, {}) config['paths']['static_files'] = "test" config["tg.app_globals"] = Bunch() config["use_sqlalchemy"] = False config["global_conf"] = Bunch() config["package"] = "test" config["call_on_shutdown"] = "foo" config["render_functions"] = Bunch() config['beaker.session.secret'] = 'some_secret'