def test_handle_exception_2(self): res = 'I fixed it!' class MyMiddleware(object): def handle_exception(self, handler, exception): raise ValueError() class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): raise ValueError() class ErrorHandler(RequestHandler): def handle_exception(self, exception): return Response(res) app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ], debug=False) app.error_handlers[500] = ErrorHandler client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, res)
def test_abort(self): class HandlerWith400(RequestHandler): def get(self, **kwargs): self.abort(400) class HandlerWith403(RequestHandler): def post(self, **kwargs): self.abort(403) class HandlerWith404(RequestHandler): def put(self, **kwargs): self.abort(404) app = Tipfy(rules=[ Rule('/400', endpoint='400', handler=HandlerWith400), Rule('/403', endpoint='403', handler=HandlerWith403), Rule('/404', endpoint='404', handler=HandlerWith404), ], debug=True) client = app.get_test_client() response = client.get('/400') self.assertEqual(response.status_code, 400) response = client.post('/403') self.assertEqual(response.status_code, 403) response = client.put('/404') self.assertEqual(response.status_code, 404)
def test_handler(self): rules = [ HandlerPrefix('resources.alternative_routing.', [ Rule('/', name='home', handler='HomeHandler'), Rule('/foo', name='home/foo', handler='HomeHandler:foo'), Rule('/bar', name='home/bar', handler='HomeHandler:bar'), Rule('/other/foo', name='other/foo', handler='OtherHandler:foo'), Rule('/other/bar', name='other/bar', handler='OtherHandler:bar'), ]) ] app = Tipfy(rules) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'home-get') response = client.get('/foo') self.assertEqual(response.data, 'home-foo') response = client.get('/bar') self.assertEqual(response.data, 'home-bar') response = client.get('/other/foo') self.assertEqual(response.data, 'other-foo') response = client.get('/other/bar') self.assertEqual(response.data, 'other-bar')
def test_custom_error_handlers(self): app = Tipfy([ Rule('/', handler=AllMethodsHandler, name='home'), Rule('/broken', handler=BrokenHandler, name='broken'), ], debug=False) app.error_handlers = { 404: Handle404, 405: Handle405, 500: Handle500, } client = app.get_test_client() res = client.get('/nowhere') self.assertEqual(res.status_code, 404) self.assertEqual(res.data, '404 custom handler') res = client.put('/broken') self.assertEqual(res.status_code, 405) self.assertEqual(res.data, '405 custom handler') self.assertEqual(res.headers.get('Allow'), 'GET') res = client.get('/broken') self.assertEqual(res.status_code, 500) self.assertEqual(res.data, '500 custom handler')
def test_redirect_relative_uris(self): class MyHandler(RequestHandler): def get(self): return self.redirect(self.request.args.get('redirect')) app = Tipfy(rules=[ Rule('/foo/bar', name='test1', handler=MyHandler), Rule('/foo/bar/', name='test2', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/foo/bar/', query_string={'redirect': '/baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/baz') response = client.get('/foo/bar/', query_string={'redirect': './baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/foo/bar/baz') response = client.get('/foo/bar/', query_string={'redirect': '../baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/foo/baz') response = client.get('/foo/bar', query_string={'redirect': '/baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/baz') response = client.get('/foo/bar', query_string={'redirect': './baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/foo/baz') response = client.get('/foo/bar', query_string={'redirect': '../baz'}) self.assertEqual(response.headers['Location'], 'http://localhost/baz')
def test_middleware_multiple_changes(self): class MyHandler(RequestHandler): middleware = [SessionMiddleware(), i18n.I18nMiddleware()] def get(self, **kwargs): locale = self.i18n.locale return Response(locale) app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler) ], config={ 'tipfy.sessions': { 'secret_key': 'secret', }, 'tipfy.i18n': { 'locale_request_lookup': [('args', 'lang'), ('session', '_locale')], } }) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'en_US') response = client.get('/?lang=pt_BR') self.assertEqual(response.data, 'pt_BR') response = client.get('/') self.assertEqual(response.data, 'pt_BR') response = client.get('/?lang=en_US') self.assertEqual(response.data, 'en_US') response = client.get('/') self.assertEqual(response.data, 'en_US')
def test_name_prefix(self): class DummyHandler(RequestHandler): def get(self, **kwargs): return '' rules = [ NamePrefix('company-', [ Rule('/', name='home', handler=DummyHandler), Rule('/about', name='about', handler=DummyHandler), Rule('/contact', name='contact', handler=DummyHandler), ]), ] app = Tipfy(rules) with app.get_test_handler('/') as handler: self.assertEqual(handler.url_for('company-home'), '/') self.assertEqual(handler.url_for('company-about'), '/about') self.assertEqual(handler.url_for('company-contact'), '/contact') with app.get_test_handler('/') as handler: self.assertEqual(handler.request.rule.name, 'company-home') with app.get_test_handler('/about') as handler: self.assertEqual(handler.request.rule.name, 'company-about') with app.get_test_handler('/contact') as handler: self.assertEqual(handler.request.rule.name, 'company-contact')
def test_custom_error_handlers(self): class HomeHandler(RequestHandler): def get(self): return Response('') app = Tipfy([ Rule('/', handler=HomeHandler, name='home'), Rule('/broken', handler=BrokenHandler, name='broken'), ], debug=False) app.error_handlers = { 404: Handle404, 405: Handle405, 500: Handle500, } client = app.get_test_client() res = client.get('/nowhere') self.assertEqual(res.status_code, 404) self.assertEqual(res.data, '404 custom handler') res = client.put('/') self.assertEqual(res.status_code, 405) self.assertEqual(res.data, '405 custom handler') self.assertEqual(res.headers.get('Allow'), 'GET') res = client.get('/broken') self.assertEqual(res.status_code, 500) self.assertEqual(res.data, '500 custom handler')
def test_make_response(self): app = Tipfy() request = Request.from_values() # Empty. response = app.make_response(request) self.assertEqual(isinstance(response, app.response_class), True) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, '') # From Response. response = app.make_response(request, Response('Hello, World!')) self.assertEqual(isinstance(response, app.response_class), True) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'Hello, World!') # From string. response = app.make_response(request, 'Hello, World!') self.assertEqual(isinstance(response, app.response_class), True) self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'Hello, World!') # From tuple. response = app.make_response(request, 'Hello, World!', 404) self.assertEqual(isinstance(response, app.response_class), True) self.assertEqual(response.status_code, 404) self.assertEqual(response.data, 'Hello, World!') # From None. self.assertRaises(ValueError, app.make_response, request, None)
def test_get_config(self): app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], config={'foo': { 'bar': 'baz', }}) with app.get_test_handler('/') as handler: self.assertEqual(handler.get_config('foo', 'bar'), 'baz')
def test_get_config(self): app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], config = { 'foo': { 'bar': 'baz', } }) with app.get_test_handler('/') as handler: self.assertEqual(handler.get_config('foo', 'bar'), 'baz')
def test_app_get_config(self): app = Tipfy() self.assertEqual(app.get_config('resources.i18n', 'locale'), 'en_US') self.assertEqual(app.get_config('resources.i18n', 'locale', 'foo'), 'en_US') self.assertEqual(app.get_config('resources.i18n'), { 'locale': 'en_US', 'timezone': 'America/Chicago', 'required': REQUIRED_VALUE, })
def compile_templates(argv=None): """Compiles templates for better performance. This is a command line script. From the buildout directory, run: bin/jinja2_compile It will compile templates from the directory configured for 'templates_dir' to the one configured for 'templates_compiled_target'. At this time it doesn't accept any arguments. """ if argv is None: argv = sys.argv set_gae_sys_path() from config import config app = Tipfy(config=config) template_path = app.get_config('tipfyext.jinja2', 'templates_dir') compiled_path = app.get_config('tipfyext.jinja2', 'templates_compiled_target') if compiled_path is None: raise ValueError('Missing configuration key to compile templates.') if isinstance(template_path, basestring): # A single path. source = os.path.join(app_path, template_path) else: # A list of paths. source = [os.path.join(app_path, p) for p in template_path] target = os.path.join(app_path, compiled_path) # Set templates dir and deactivate compiled dir to use normal loader to # find the templates to be compiled. app.config['tipfyext.jinja2']['templates_dir'] = source app.config['tipfyext.jinja2']['templates_compiled_target'] = None if target.endswith('.zip'): zip_cfg = 'deflated' else: zip_cfg = None old_list_templates = FileSystemLoader.list_templates FileSystemLoader.list_templates = list_templates env = Jinja2.factory(app, 'jinja2').environment env.compile_templates(target, extensions=None, filter_func=filter_templates, zip=zip_cfg, log_function=logger, ignore_errors=False, py_compile=False) FileSystemLoader.list_templates = old_list_templates
def test_request_handler_get_config(self): app = Tipfy() with app.get_test_context() as request: handler = RequestHandler(request) self.assertEqual(handler.get_config('resources.i18n', 'locale'), 'en_US') self.assertEqual(handler.get_config('resources.i18n', 'locale', 'foo'), 'en_US') self.assertEqual(handler.get_config('resources.i18n'), { 'locale': 'en_US', 'timezone': 'America/Chicago', 'required': REQUIRED_VALUE, })
def test_405_debug(self): class HomeHandler(RequestHandler): pass app = Tipfy(rules=[ Rule('/', endpoint='home', handler=HomeHandler), ], debug=True) client = app.get_test_client() for method in ALLOWED_METHODS: response = client.open('/', method=method) self.assertEqual(response.status_code, 405)
def test_500(self): """Handler import will fail.""" app = Tipfy(rules=[Rule('/', name='home', handler='non.existent.handler')]) client = app.get_test_client() # Normal mode. response = client.get('/') self.assertEqual(response.status_code, 500) # Debug mode. app.debug = True app.config['tipfy']['enable_debugger'] = False self.assertRaises(ImportError, client.get, '/')
def test_redirect_empty(self): class HandlerWithRedirect(RequestHandler): def get(self, **kwargs): return self.redirect('/', empty=True) app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), Rule('/redirect-me', name='redirect', handler=HandlerWithRedirect), ]) client = app.get_test_client() response = client.get('/redirect-me', follow_redirects=False) self.assertEqual(response.data, '')
def test_redirect_to_empty(self): class HandlerWithRedirectTo(RequestHandler): def get(self, **kwargs): return self.redirect_to('home', _empty=True) app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), Rule('/redirect-me', name='redirect', handler=HandlerWithRedirectTo), ]) client = app.get_test_client() response = client.get('/redirect-me', follow_redirects=False) self.assertEqual(response.data, '')
def test_501(self): """Method is not in app.allowed_methods.""" app = Tipfy() client = app.get_test_client() # Normal mode. response = client.open('/', method='CONNECT') self.assertEqual(response.status_code, 501) # Debug mode. app.debug = True response = client.open('/', method='CONNECT') self.assertEqual(response.status_code, 501)
def test_json(self): class JsonHandler(RequestHandler): def get(self, **kwargs): return Response(self.request.json['foo']) app = Tipfy(rules=[ Rule('/', name='home', handler=JsonHandler), ], debug=True) data = json_encode({'foo': 'bar'}) client = app.get_test_client() response = client.get('/', content_type='application/json', data=data) self.assertEqual(response.data, 'bar')
def test_404(self): """No URL rules defined.""" app = Tipfy() client = app.get_test_client() # Normal mode. response = client.get('/') self.assertEqual(response.status_code, 404) # Debug mode. app.debug = True response = client.get('/') self.assertEqual(response.status_code, 404)
def test_handle_exception(self): app = Tipfy([ Rule('/', handler=AllMethodsHandler, name='home'), Rule('/broken', handler=BrokenHandler, name='broken'), Rule('/broken-but-fixed', handler=BrokenButFixedHandler, name='broken-but-fixed'), ], debug=False) client = app.get_test_client() response = client.get('/broken') self.assertEqual(response.status_code, 500) response = client.get('/broken-but-fixed') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'That was close!')
def test_500(self): """Handler import will fail.""" app = Tipfy( rules=[Rule('/', name='home', handler='non.existent.handler')]) client = app.get_test_client() # Normal mode. response = client.get('/') self.assertEqual(response.status_code, 500) # Debug mode. app.debug = True app.config['tipfy']['enable_debugger'] = False self.assertRaises(ImportError, client.get, '/')
def test_request_handler_get_config(self): app = Tipfy() with app.get_test_context() as request: handler = RequestHandler(request) self.assertEqual(handler.get_config('resources.i18n', 'locale'), 'en_US') self.assertEqual( handler.get_config('resources.i18n', 'locale', 'foo'), 'en_US') self.assertEqual( handler.get_config('resources.i18n'), { 'locale': 'en_US', 'timezone': 'America/Chicago', 'required': REQUIRED_VALUE, })
def test_dev_run(self): self._set_dev_server_flag(True) os.environ['APPLICATION_ID'] = 'my-app' os.environ['SERVER_SOFTWARE'] = 'Development' os.environ['SERVER_NAME'] = 'localhost' os.environ['SERVER_PORT'] = '8080' os.environ['REQUEST_METHOD'] = 'GET' app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], debug=True) app.run() self.assertEqual(sys.stdout.getvalue(), 'Status: 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 11\r\n\r\nMethod: GET')
def test_engine_factory(self): def get_jinja2_env(): app = handler.app cfg = app.get_config('tipfyext.jinja2') loader = FileSystemLoader(cfg.get('templates_dir')) return Environment(loader=loader) app = Tipfy( config={ 'tipfyext.jinja2': { 'templates_dir': templates_dir, 'engine_factory': get_jinja2_env, } }) local.request = Request.from_values() local.request.app = app handler = RequestHandler(local.request) jinja2 = Jinja2(app) message = 'Hello, World!' res = jinja2.render_template(handler, 'template1.html', message=message) self.assertEqual(res, message)
def test_render_template_with_i18n(self): app = Tipfy( config={ 'tipfyext.jinja2': { 'templates_dir': templates_dir, 'environment_args': dict( autoescape=True, extensions=[ 'jinja2.ext.autoescape', 'jinja2.ext.with_', 'jinja2.ext.i18n' ], ), }, 'tipfy.sessions': { 'secret_key': 'secret', }, }) local.request = Request.from_values() local.request.app = app handler = RequestHandler(local.request) jinja2 = Jinja2(app) message = 'Hello, i18n World!' res = jinja2.render_template(handler, 'template2.html', message=message) self.assertEqual(res, message)
def test_handler_prefix(self): rules = [ HandlerPrefix('resources.handlers.', [ Rule('/', name='home', handler='HomeHandler'), Rule('/defaults', name='defaults', handler='HandlerWithRuleDefaults', defaults={'foo': 'bar'}), ]) ] app = Tipfy(rules) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'Hello, World!') response = client.get('/defaults') self.assertEqual(response.data, 'bar')
def test_render_json_response(self): local.current_handler = HomeHandler(Tipfy(), Request.from_values()) response = render_json_response({'foo': 'bar'}) self.assertEqual(isinstance(response, Response), True) self.assertEqual(response.mimetype, 'application/json') self.assertEqual(response.data, '{"foo":"bar"}')
def test_store_instances(self): from tipfy.appengine.auth import AuthStore from tipfy.i18n import I18nStore from tipfy.sessions import SecureCookieSession app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), ], config={ 'tipfy.sessions': { 'secret_key': 'secret', }, }) with app.get_test_handler('/') as handler: self.assertEqual(isinstance(handler.session, SecureCookieSession), True) self.assertEqual(isinstance(handler.auth, AuthStore), True) self.assertEqual(isinstance(handler.i18n, I18nStore), True)
def test_url_for(self): app = Tipfy(rules=[ Rule('/', name='home', handler=AllMethodsHandler), Rule('/about', name='about', handler='handlers.About'), Rule('/contact', name='contact', handler='handlers.Contact'), ]) with app.get_test_handler('/') as handler: self.assertEqual(handler.url_for('home'), '/') self.assertEqual(handler.url_for('about'), '/about') self.assertEqual(handler.url_for('contact'), '/contact') # Extras self.assertEqual(handler.url_for('about', _anchor='history'), '/about#history') self.assertEqual(handler.url_for('about', _full=True), 'http://localhost/about') self.assertEqual(handler.url_for('about', _netloc='www.google.com'), 'http://www.google.com/about') self.assertEqual(handler.url_for('about', _scheme='https'), 'https://localhost/about')
def test_format_date_no_format_but_configured(self): app = Tipfy(config={ 'tipfy.sessions': { 'secret_key': 'secret', }, 'tipfy.i18n': { 'timezone': 'UTC', 'date_formats': { 'time': 'medium', 'date': 'medium', 'datetime': 'medium', 'time.short': None, 'time.medium': None, 'time.full': None, 'time.long': None, 'date.short': None, 'date.medium': 'full', 'date.full': None, 'date.long': None, 'datetime.short': None, 'datetime.medium': None, 'datetime.full': None, 'datetime.long': None, } } }) local.current_handler = RequestHandler(app, Request.from_values('/')) value = datetime.datetime(2009, 11, 10, 16, 36, 05) self.assertEqual(i18n.format_date(value), u'Tuesday, November 10, 2009')
def test_renew_session(self): app = Tipfy() request = Request.from_values('/') local.current_handler = RequestHandler(app, request) user = User.create('my_username', 'my_id') user.renew_session(max_age=86400)
def test_render_json_response(self): with Tipfy().get_test_context() as request: response = render_json_response({'foo': 'bar'}) self.assertEqual(isinstance(response, Response), True) self.assertEqual(response.mimetype, 'application/json') self.assertEqual(response.data, '{"foo":"bar"}')
def get_app(): app = Tipfy(rules=[ Rule('/login', name='auth/login', handler=LoginHandler), Rule('/logout', name='auth/logout', handler=LogoutHandler), Rule('/signup', name='auth/signup', handler=SignupHandler), ]) return app
def test_handle_exception_3(self): class MyMiddleware(object): def handle_exception(self, handler, exception): pass class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): raise ValueError() app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/') self.assertEqual(response.status_code, 500)
def _get_app(self, *args, **kwargs): app = Tipfy(config={ 'tipfy.sessions': { 'secret_key': 'secret', }, }) local.current_handler = handler = RequestHandler(app, Request.from_values(*args, **kwargs)) return app
def test_200(self): app = Tipfy(rules=[Rule('/', name='home', handler=AllMethodsHandler)]) client = app.get_test_client() for method in app.allowed_methods: response = client.open('/', method=method) self.assertEqual(response.status_code, 200, method) if method == 'HEAD': self.assertEqual(response.data, '') else: self.assertEqual(response.data, 'Method: %s' % method) # App Engine mode. self._set_dev_server_flag(True) response = client.get('/') self.assertEqual(response.status_code, 200) self.assertEqual(response.data, 'Method: GET')
def test_redirect(self): class HomeHandler(RequestHandler): def get(self, **kwargs): return Response('Home sweet home!') class HandlerWithRedirect(RequestHandler): def get(self, **kwargs): return self.redirect('/') app = Tipfy(rules=[ Rule('/', endpoint='home', handler=HomeHandler), Rule('/redirect-me', endpoint='redirect', handler=HandlerWithRedirect), ], debug=True) client = app.get_test_client() response = client.get('/redirect-me', follow_redirects=True) self.assertEqual(response.data, 'Home sweet home!')
def test_200(self): class MyHandler(RequestHandler): def delete(self, **kwargs): return Response('Method: %s' % self.request.method) get = head = options = post = put = trace = delete app = Tipfy(rules=[Rule('/', name='home', handler=MyHandler)]) client = app.get_test_client() for method in ALLOWED_METHODS: response = client.open('/', method=method) self.assertEqual(response.status_code, 200, method) if method == 'HEAD': self.assertEqual(response.data, '') else: self.assertEqual(response.data, 'Method: %s' % method)
def test_render_template(self): app = Tipfy(config={'tipfyext.mako': {'templates_dir': templates_dir}}) request = Request.from_values() local.current_handler = handler = RequestHandler(app, request) mako = Mako(app) message = 'Hello, World!' res = mako.render_template(local.current_handler, 'template1.html', message=message) self.assertEqual(res, message + '\n')
def test_regex_converter(self): class TestHandler(RequestHandler): def get(self, **kwargs): return Response(kwargs.get('path')) app = Tipfy([ Rule('/<regex(".*"):path>', name='home', handler=TestHandler), ]) client = app.get_test_client() response = client.get('/foo') self.assertEqual(response.data, 'foo') response = client.get('/foo/bar') self.assertEqual(response.data, 'foo/bar') response = client.get('/foo/bar/baz') self.assertEqual(response.data, 'foo/bar/baz')
def test_abort(self): class HandlerWithAbort(RequestHandler): def get(self, **kwargs): self.abort(kwargs.get('status_code')) app = Tipfy(rules=[ Rule('/<int:status_code>', name='abort-me', handler=HandlerWithAbort), ]) client = app.get_test_client() response = client.get('/400') self.assertEqual(response.status_code, 400) response = client.get('/403') self.assertEqual(response.status_code, 403) response = client.get('/404') self.assertEqual(response.status_code, 404)
def test_check_password(self): app = Tipfy() request = Request.from_values('/') local.current_handler = RequestHandler(app, request) user = User.create('my_username', 'my_id', password='******') self.assertEqual(user.check_password('foo'), True) self.assertEqual(user.check_password('bar'), False)
def test_function_handler(self): rules = [ HandlerPrefix('resources.alternative_routing.', [ Rule('/', name='home', handler='home'), Rule('/foo', name='home/foo', handler='foo'), Rule('/bar', name='home/bar', handler='bar'), ]) ] app = Tipfy(rules) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, 'home') response = client.get('/foo') self.assertEqual(response.data, 'foo') response = client.get('/bar') self.assertEqual(response.data, 'bar')
def test_store_classes(self): from tipfy.appengine.auth import AuthStore from tipfy.i18n import I18nStore from tipfy.sessions import SessionStore app = Tipfy() self.assertEqual(app.auth_store_class, AuthStore) self.assertEqual(app.i18n_store_class, I18nStore) self.assertEqual(app.session_store_class, SessionStore)
def test_handle_exception(self): res = 'Catched!' class MyMiddleware(object): def handle_exception(self, handler, exception): return Response(res) class MyHandler(RequestHandler): middleware = [MyMiddleware()] def get(self, **kwargs): raise ValueError() app = Tipfy(rules=[ Rule('/', name='home', handler=MyHandler), ]) client = app.get_test_client() response = client.get('/') self.assertEqual(response.data, res)