def test_big_mw_stack(): from clastic.middleware import (client_cache, compress, context, cookie, form, profile, stats, url) middlewares = [client_cache.HTTPCacheMiddleware(), compress.GzipMiddleware(), context.ContextProcessor(), context.SimpleContextProcessor(), cookie.SignedCookieMiddleware(), form.PostDataMiddleware({'lol': str}), profile.SimpleProfileMiddleware(), stats.StatsMiddleware(), url.ScriptRootMiddleware(), url.GetParamMiddleware({})] [repr(mw) for mw in middlewares] app = Application([('/', hello_world)], middlewares=middlewares) cl = app.get_local_client() resp = cl.get('/') assert resp.status_code == 200
def test_ctx_proc_nonctx(): add_name = ContextProcessor(defaults={'name': 'Kurt'}) app = Application([('/', hello_world_str, render_basic)], middlewares=[add_name]) c = app.get_local_client() resp = c.get('/') assert resp.data == b'Hello, world!'
def test_default_render(): app = Application([('/', hello_world_ctx, render_basic), ('/<name>/', hello_world_ctx, render_basic), ('/text/<name>/', hello_world_str, render_basic), ('/html/<name>/', hello_world_html, render_basic), ('/beta/<name>/', complex_context, render_basic)]) assert callable(app.routes[0]._execute) assert callable(app.routes[0].render) c = app.get_local_client() resp = c.get('/') # test simple json with endpoint default assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' resp = c.get('/Kurt/') # test simple json with url param assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Kurt' resp = c.get('/beta/Rajkumar/') # test fancy json assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Rajkumar' assert resp_data['date'] assert len(resp_data) > 4 resp = c.get('/text/Noam/') # test text assert resp.status_code == 200 assert resp.data == b'Hello, Noam!' resp = c.get('/html/Asia/') # test basic html assert resp.status_code == 200 assert 'text/html' in resp.headers['Content-Type']
def test_serve(): cookie_session = CookieSessionMiddleware() app = Application( [("/", session_hello_world, default_response), ("/<name>/", session_hello_world, default_response)], middlewares=[cookie_session], ) yield ok_, app.serve(_jk_just_testing=True)
def test_default_render(): app = Application([('/', hello_world_ctx, render_basic), ('/<name>/', hello_world_ctx, render_basic), ('/text/<name>/', hello_world_str, render_basic), ('/html/<name>/', hello_world_html, render_basic), ('/beta/<name>/', complex_context, render_basic)]) assert callable(app.routes[0]._execute) assert callable(app.routes[0]._render) c = app.get_local_client() resp = c.get('/') # test simple json with endpoint default assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' resp = c.get('/Kurt/') # test simple json with url param assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Kurt' resp = c.get('/beta/Rajkumar/') # test fancy json assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Rajkumar' assert resp_data['date'] assert len(resp_data) > 4 resp = c.get('/text/Noam/') # test text assert resp.status_code == 200 assert resp.data == b'Hello, Noam!' resp = c.get('/html/Asia/') # test basic html assert resp.status_code == 200 assert 'text/html' in resp.headers['Content-Type']
def test_custom_table_render(): def hello_world_ctx(name=None): """ This docstring will be visible in the rendered response. Links like https://example.com and www.example.com will be linkified automatically. """ if name is None: name = 'world' greeting = 'Hello, %s!' % name return {'name': name, 'greeting': greeting} class BoldHTMLTable(Table): def get_cell_html(self, value): std_html = super(BoldHTMLTable, self).get_cell_html(value) return '<b>' + std_html + '</b>' custom_tr = TabularRender(table_type=BoldHTMLTable) custom_render = BasicRender(tabular_render=custom_tr) app = Application([('/', hello_world_ctx, custom_render)]) c = app.get_local_client() resp = c.get('/?format=html') assert resp.status_code == 200 resp_data = resp.get_data(True) assert '<b>' in resp_data assert '<a href="https://example.com">' in resp_data
def test_direct_no_render(): render_raises_mw = RenderRaisesMiddleware() app = Application([('/', hello_world)], middlewares=[render_raises_mw]) c = app.get_local_client() resp = c.get('/') assert resp.data == b'Hello, world!'
def main(db_name): all_oggs = open_db(db_name) oggs = [f for f in all_oggs if f['length'] > MIN_OGG_LENGTH] oggs = [f for f in oggs if not SPOKEN_RE.match(f['img_name'])] name_idx_map = {name['img_name']: i for i, name in enumerate(oggs)} rand_oggs = list(oggs) random.shuffle(rand_oggs) rand_name_idx_map = {name['img_name']: i for i, name in enumerate(rand_oggs)} render_jsonp = JSONPRender() cur_dir = os.path.abspath(os.path.dirname(__file__)) resources = {'oggs': oggs, 'rand_oggs': rand_oggs, 'all_oggs': all_oggs, 'name_idx_map': name_idx_map, 'rand_name_idx_map': rand_name_idx_map} routes = [('/rand', random_oggs, render_jsonp), ('/rand/<int:k>', random_oggs, render_jsonp), ('/recent', recent_oggs, render_jsonp), ('/recent/<int:k>', recent_oggs, render_jsonp), ('/rand_dur', random_by_dur, render_jsonp), ('/rand_dur/<int:k>', random_by_dur, render_jsonp)] middlewares = [GetParamMiddleware('callback'), GetParamMiddleware('name'), GetParamMiddleware('min'), GetParamMiddleware('max')] app = Application(routes, resources, middlewares=middlewares) app.serve(static_path=cur_dir)
def test_http_method_routes(): ep = lambda _route: repr(_route.methods) routes = [ GET('/get', ep, render_basic), POST('/post', ep, render_basic), PUT('/put', ep, render_basic), DELETE('/delete', ep, render_basic) ] app = Application(routes) client = app.get_local_client() methods = ('get', 'post', 'put', 'delete') status_map = {} for correct_method in methods: for attempted_method in methods: req_func = getattr(client, attempted_method) resp = req_func('/' + correct_method) status_code = resp.status_code try: status_map[status_code] += 1 except KeyError: status_map[status_code] = 1 if status_code == 200: resp_data = resp.data # lololol yay eval() route_methods = eval(resp_data) - set(['HEAD']) assert set([correct_method.upper()]) == route_methods assert status_map[200] == len(routes) assert status_map.get(405) == len(routes) * (len(methods) - 1) return
def test_nonbreaking_exc(): app = Application([('/', lambda: NotFound(is_breaking=False)), ('/', lambda: 'so hot in here', render_basic)]) client = app.get_local_client() resp = client.get('/') assert resp.status_code == 200 assert resp.data == b'so hot in here'
def test_json_render(render_json=None): if render_json is None: render_json = JSONRender(dev_mode=True) app = Application([('/', hello_world_ctx, render_json), ('/<name>/', hello_world_ctx, render_json), ('/beta/<name>/', complex_context, render_json)]) assert callable(app.routes[0]._execute) assert callable(app.routes[0].render) c = app.get_local_client() resp = c.get('/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' resp = c.get('/Kurt/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Kurt' resp = c.get('/beta/Rajkumar/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Rajkumar' assert resp_data['date'] assert len(resp_data) > 4
def test_error_render_count(): class AccumErrorHandler(ErrorHandler): def render_error(self, _error, request, error_list, **kwargs): if 'reraise' in request.path: raise _error if 'badgateway' in request.path: _error = BadGateway() error_list.append(_error) return _error rt = Route('/<number:int>/<option?>', odd_endpoint, render_basic) error_list = [] rsrc = {'error_list': error_list} app = Application([rt], rsrc, error_handler=AccumErrorHandler()) cl = app.get_local_client() err_resp = cl.get('/39') assert err_resp.status_code == 200 err_resp = cl.get('/2') assert err_resp.status_code == 500 assert len(error_list) == 1 # reraising means the error will be handled by the default # handler, so no length change should occur err_resp = cl.get('/4/reraise') assert err_resp.status_code == 500 assert len(error_list) == 1 err_resp = cl.get('/6/badgateway') assert err_resp.status_code == 502 assert len(error_list) == 2
def test_json_render(render_json=None): if render_json is None: render_json = JSONRender(dev_mode=True) app = Application([('/', hello_world_ctx, render_json), ('/<name>/', hello_world_ctx, render_json), ('/beta/<name>/', complex_context, render_json)]) assert callable(app.routes[0]._execute) assert callable(app.routes[0]._render) c = app.get_local_client() resp = c.get('/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' resp = c.get('/Kurt/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Kurt' resp = c.get('/beta/Rajkumar/') assert resp.status_code == 200 resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Rajkumar' assert resp_data['date'] assert len(resp_data) > 4
def test_error_render_count(): class AccumErrorHandler(ErrorHandler): def render_error(self, _error, request, error_list, **kwargs): if 'reraise' in request.path: raise _error if 'badgateway' in request.path: _error = BadGateway() error_list.append(_error) return _error rt = Route('/<number:int>/<option?>', odd_endpoint, render_basic) error_list = [] rsrc = {'error_list': error_list} app = Application([rt], rsrc, error_handler=AccumErrorHandler()) cl = app.get_local_client() err_resp = cl.get('/39') assert err_resp.status_code == 200 err_resp = cl.get('/2') assert err_resp.status_code == 500 assert len(error_list) == 1 # reraising means the error will be handled by the default # handler, so no length change should occur err_resp = cl.get('/4/reraise') assert err_resp.status_code == 500 assert len(error_list) == 1 err_resp = cl.get('/6/badgateway') #if err_resp.status_code != 502: # import pdb;pdb.set_trace() assert err_resp.status_code == 502 assert len(error_list) == 2
def test_meta_basic(): app = Application([('/meta', MetaApplication()), ('/<name?>', cookie_hello_world, render_basic)], middlewares=[SignedCookieMiddleware()]) cl = app.get_local_client() assert cl.get('/').status_code == 200 assert cl.get('/meta/').status_code == 200
def test_ctx_proc_empty(): add_name = ContextProcessor() app = Application([('/', hello_world_ctx, render_json)], middlewares=[add_name]) c = app.get_local_client() resp = c.get('/') resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' # does overwrite
def test_basic_static_route(): static_app = Application([StaticFileRoute('/source_code', _CUR_DIR + '/test_static.py')]) c = static_app.get_local_client() resp = c.get('/source_code') assert resp.mimetype in ('text/x-python', 'text/plain') # text/plain on appveyor/windows for some reason assert resp.status_code == 200
def test_req_provides(): req_provides = RequestProvidesName('Rajkumar') app = Application([('/', hello_world)], middlewares=[req_provides]) c = app.get_local_client() resp = c.get('/') assert resp.data == b'Hello, Rajkumar!' resp = c.get('/?name=Kurt') assert resp.data == b'Hello, Kurt!'
def test_get_param_mw(): get_name_mw = GetParamMiddleware(['name', 'date']) app = Application([('/', hello_world)], middlewares=[get_name_mw]) c = app.get_local_client() resp = c.get('/') assert resp.data == b'Hello, world!' resp = c.get('/?name=Kurt') assert resp.data == b'Hello, Kurt!'
def test_chameleon_broken_template(): chameleon_render = ChameleonRenderFactory(_TMPL_DIR) tmpl = 'broken_template_1.pt' app = Application([('/', hello_world_ctx, tmpl)], render_factory=chameleon_render) c = app.get_local_client() resp = c.get('/') assert resp.status_code == 500 assert len(resp.data) > 1024 # a longish response
def main(): rsc = {'data': _DATA} gpm = GetParamMiddleware('url') atr = AutoTableRenderer(max_depth=5) render_basic = BasicRender() app = Application([('/', ident_ep, render_basic), ('/json', ident_ep, render_basic), ('/fetch', fetch_json, render_basic)], rsc, [gpm]) app.serve()
def test_broken_decorated(): req_provides_blank = RequestProvidesName() app = Application([('/', hello_world_no)], middlewares=[req_provides_blank]) c = app.get_local_client() resp = c.get('/') assert resp.data == b'Hello, world!' resp = c.get('/?name=Kurt') assert resp.data != b'Hello, Kurt!'
def test_redirector(): redirect_other = Redirector('/other') app = Application([('/', redirect_other)]) c = app.get_local_client() resp = c.get('/') assert resp.status_code == 301 assert resp.headers['Location'] == 'http://localhost/other' repr(redirect_other)
def test_simple_ctx_proc(): add_name_lang = SimpleContextProcessor(name='Kurt', language='en') app = Application([('/', hello_world_ctx, render_json)], middlewares=[add_name_lang]) c = app.get_local_client() resp = c.get('/') resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' # does not overwrite assert resp_data['language'] == 'en'
def test_nondebug_server_errors(): app = Application([('/', _raiser, render_basic)], debug=False) cl = app.get_local_client() resps = [] resps.append(cl.get('/', headers={'Accept': 'text/plain'})) resps.append(cl.get('/', headers={'Accept': 'text/html'})) resps.append(cl.get('/', headers={'Accept': 'application/json'})) resps.append(cl.get('/', headers={'Accept': 'application/xml'})) assert all(['RuntimeError' in r.get_data(True) for r in resps])
def test_serve(): cookie_mw = SignedCookieMiddleware() app = Application([('/', cookie_hello_world, render_basic), ('/<name>/', cookie_hello_world, render_basic)], middlewares=[cookie_mw]) assert app.serve(_jk_just_testing=True, static_path=_CUR_DIR) cl = app.get_local_client() assert cl.get('/').status_code == 200 assert cl.get('/static/test_serve.py').status_code == 200
def test_broken_error_render(): class BrokenErrorHandler(ErrorHandler): def render_error(self, **kwargs): 1/0 rt = Route('/<number:int>', odd_endpoint, render_basic) app = Application([rt], error_handler=BrokenErrorHandler()) cl = app.get_local_client() err_resp = cl.get('/2') assert err_resp.status_code == 500 assert b'not in my house' in err_resp.data
def test_reroute_wsgi(): # simulate home page served by one app, and all else by another other_app = Application([('/other', lambda: 'okay', render_basic)]) main_app = Application([('/', lambda: 'hooray', render_basic), ('/<x*str>', RerouteWSGI(other_app))]) cl = main_app.get_local_client() resp = cl.get('/') assert resp.get_data(as_text=True) == 'hooray' resp = cl.get('/other/') assert resp.get_data(as_text=True) == 'okay'
def test_broken_error_render(): class BrokenErrorHandler(ErrorHandler): def render_error(self, **kwargs): 1 / 0 rt = Route('/<number:int>', odd_endpoint, render_basic) app = Application([rt], error_handler=BrokenErrorHandler()) cl = app.get_local_client() err_resp = cl.get('/2') assert err_resp.status_code == 500 assert b'not in my house' in err_resp.data
def test_resource_redaction(): app = Application(routes=[('/meta', MetaApplication())], resources={'a_secret': 'vsecret', 'ok': 'bokay'}) cl = app.get_local_client() resp = cl.get('/meta/') assert resp.status_code == 200 content = resp.get_data(as_text=True) assert 'bokay' in content assert 'vsecret' not in content
def test_nondebug_notfound_errors(): app = Application([('/', _raiser, render_basic)], debug=True) cl = app.get_local_client() nf_url = '/nf' resps = [] resps.append(cl.get(nf_url, headers={'Accept': 'text/plain'})) resps.append(cl.get(nf_url, headers={'Accept': 'text/html'})) resps.append(cl.get(nf_url, headers={'Accept': 'application/xml'})) resps.append(cl.get(nf_url, headers={'Accept': 'application/json'})) assert all(['not found' in r.get_data(True).lower() for r in resps])
def test_create_route_order_incr(): "tests route order when routes are added incrementally" routes = [('/api/<api_path+>', api, render_basic), ('/<one>/<two>', two_segments, render_basic), ('/<one>/<two>/<three>', three_segments, render_basic)] app = Application() client = app.get_local_client() for r in routes: app.add(r) assert client.get('/api/a/b').data == b'api: a/b' assert app.routes[-1].get_info()['url_pattern'] == r[0] return
def test_create_route_order_incr(): "tests route order when routes are added incrementally" routes = [('/api/<path:api_path>', api, render_basic), ('/<one>/<two>', two_segments, render_basic), ('/<one>/<two>/<three>', three_segments, render_basic)] app = Application() client = Client(app, BaseResponse) for r in routes: app.add(r) yield eq_, client.get('/api/a/b').data, 'api: a/b' yield eq_, app.wmap._rules[-1].rule, r[0] return
def test_serve(): cookie_mw = SignedCookieMiddleware() app = Application([('/', cookie_hello_world, render_basic), ('/<name>/', cookie_hello_world, render_basic)], middlewares=[cookie_mw]) yield ok_, app.serve(_jk_just_testing=True, static_path=_CUR_DIR) cl = Client(app, Response) yield eq_, cl.get('/').status_code, 200 yield eq_, cl.get('/_meta/').status_code, 200 yield eq_, cl.get('/static/test_serve.py').status_code, 200
def test_gzip_mw(): from clastic.middleware import compress app = Application([('/<name>', hello_world)], middlewares=[compress.GzipMiddleware()]) cl = app.get_local_client() resp = cl.get('/' + 'a' * 2000) assert resp.status_code == 200 assert len(resp.get_data()) > 2000 resp = cl.get('/' + 'a' * 2000, headers={'Accept-Encoding': 'gzip'}) assert resp.status_code == 200 assert len(resp.get_data()) < 200
def main(db_name): oggs = open_db(db_name) oggs = [f for f in oggs if f['length'] > MIN_OGG_LENGTH] render_jsonp = JSONPRender() cur_dir = os.path.abspath(os.path.dirname(__file__)) resources = {'oggs': oggs} routes = [('/rand', random_oggs, render_jsonp), ('/rand/<k>', random_oggs, render_jsonp)] app = Application(routes, resources, middlewares=[GetParamMiddleware('callback')]) app.serve(static_path=cur_dir)
def test_profile_mw(): from clastic.middleware import profile app = Application([('/<name?>', hello_world)], middlewares=[profile.SimpleProfileMiddleware()]) cl = app.get_local_client() resp = cl.get('/') assert resp.status_code == 200 resp = cl.get('/?_prof=true') assert resp.status_code == 200 resp_data = resp.get_data(True) assert 'function calls in 0.00' in resp_data # e.g., 46 function calls in 0.000 seconds but that's variable/flaky
def test_create_route_order_incr(): "tests route order when routes are added incrementally" routes = [('/api/<api_path+>', api, render_basic), ('/<one>/<two>', two_segments, render_basic), ('/<one>/<two>/<three>', three_segments, render_basic)] app = Application() client = app.get_local_client() for r in routes: app.add(r) assert client.get('/api/a').data == b'api: a' assert client.get('/api/a/b/').data == b'api: a/b' return
def test_debug_raises(): app_nodebug = Application([('/', lambda: 1/0)], debug=False) client = app_nodebug.get_local_client() assert client.get('/').status_code == 500 err_handler = ErrorHandler(reraise_uncaught=True) app_debug = Application([('/', lambda: 1/0)], error_handler=err_handler) client = app_debug.get_local_client() with raises(ZeroDivisionError): client.get('/') return
def test_debug_server_errors(): app = Application([GET('/', _raiser, render_basic)], debug=True) cl = app.get_local_client() resps = [] resps.append(cl.get('/', headers={'Accept': 'text/plain'})) resps.append(cl.get('/', headers={'Accept': 'text/html'})) json_resp = cl.get('/', headers={'Accept': 'application/json'}) resps.append(json_resp) resps.append(cl.get('/', headers={'Accept': 'application/xml'})) assert all(['RuntimeError' in r.get_data(True) for r in resps]) json_data = json.loads(json_resp.get_data(True)) assert json_data['clastic_version'] == __version__
def test_ctx_proc_req(): req_provides_name = RequestProvidesName() add_name_lang = ContextProcessor(['name'], {'language': 'en'}) app = Application([('/', hello_world_ctx, render_json)], middlewares=[req_provides_name, add_name_lang]) c = app.get_local_client() resp = c.get('/') resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'world' # does not overwrite assert resp_data['language'] == 'en' resp = c.get('/?name=Alex') resp_data = json.loads(resp.get_data(True)) assert resp_data['name'] == 'Alex' # still does not overwrite
def test_chameleon_mixed(): chameleon_render = ChameleonRenderFactory(_TMPL_DIR) tmpl = 'basic_template.pt' app = Application([('/', hello_world_ctx, tmpl), ('/json/', hello_world_ctx, render_basic)], render_factory=chameleon_render) c = app.get_local_client() resp = c.get('/') assert resp.status_code == 200 assert b'clasty' in resp.data resp = c.get('/json/') assert resp.status_code == 200
def test_create_route_order_list(): "tests route order when routes are added as a list" routes = [('/api/<api_path+>', api, render_basic), ('/<one>/<two>', two_segments, render_basic), ('/<one>/<two>/<three>', three_segments, render_basic)] app = Application(routes) client = app.get_local_client() assert client.get('/api/a').data == b'api: a' assert client.get('/api/a/b').data == b'api: a/b' for i, rt in enumerate(app.routes): assert rt.pattern == routes[i][0] return