def test_secure_cookie_session_interface_open_session() -> None: session = SecureCookieSession() session['something'] = 'else' interface = SecureCookieSessionInterface() app = Quart(__name__) app.secret_key = 'secret' response = Response('') interface.save_session(app, session, response) request = Request('GET', 'http', '/', b'', CIMultiDict()) request.headers['Cookie'] = response.headers['Set-Cookie'] new_session = interface.open_session(app, request) assert new_session == session
async def test_propagation(debug: bool, testing: bool, raises: bool, http_scope: HTTPScope) -> None: app = Quart(__name__) @app.route("/") async def exception() -> ResponseReturnValue: raise SimpleError() app.debug = debug app.testing = testing test_client = app.test_client() if raises: with pytest.raises(SimpleError): await app.handle_request( Request( "GET", "http", "/", b"", Headers(), "", "1.1", http_scope, send_push_promise=no_op_push, )) else: response = await test_client.get("/") assert response.status_code == 500
def test_access_log_standard_atoms() -> None: request_headers = CIMultiDict({ 'Referer': 'stet.io', 'Remote-Addr': '127.0.0.1', 'User-Agent': 'quart', }) request = Request('GET', '/?x=y', request_headers) response = Response('Hello', 202) atoms = AccessLogAtoms(request, response, 'h2', 0.000023) assert atoms['h'] == '127.0.0.1' assert atoms['l'] == '-' assert time.strptime(atoms['t'], '[%d/%b/%Y:%H:%M:%S %z]') assert int(atoms['s']) == 202 assert atoms['m'] == 'GET' assert atoms['U'] == '/' assert atoms['q'] == 'x=y' assert atoms['H'] == 'h2' assert int(atoms['b']) == len('Hello') assert int(atoms['B']) == len('Hello') assert atoms['f'] == 'stet.io' assert atoms['a'] == 'quart' assert atoms['p'] == f"<{os.getpid()}>" assert atoms['not-atom'] == '-' assert atoms['T'] == 0 assert atoms['D'] == 23 assert atoms['L'] == '0.000023'
async def test_after_this_request() -> None: async with RequestContext( Quart(__name__), Request('GET', 'http', '/', CIMultiDict()), ) as context: after_this_request(lambda: 'hello') assert context._after_request_functions[0]() == 'hello'
async def test_has_request_context() -> None: async with RequestContext(Quart(__name__), Request('GET', 'http', '/', CIMultiDict())): assert has_request_context() is True assert has_app_context() is True assert has_request_context() is False assert has_app_context() is False
def test_bad_request_if_websocket_route() -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.return_value = Rule('/', {'GET'}, 'index', is_websocket=True), {} app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request('GET', 'http', '/', b'', CIMultiDict()) RequestContext(app, request) assert isinstance(request.routing_exception, BadRequest)
def test_basic_authorization() -> None: headers = CIMultiDict() headers['Authorization'] = "Basic {}".format( b64encode(b'identity:secret').decode('ascii')) request = Request('GET', '/', headers) auth = request.authorization assert auth.username == 'identity' assert auth.password == 'secret'
async def test_has_request_context() -> None: app = Quart(__name__) headers, path, query_string = make_test_headers_path_and_query_string(app, '/') async with RequestContext(Quart(__name__), Request('GET', 'http', path, query_string, headers)): assert has_request_context() is True assert has_app_context() is True assert has_request_context() is False assert has_app_context() is False
def test_request_context_match() -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.return_value = ('Rule', {'arg': 'value'}) app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request('GET', '/', CIMultiDict(), None) RequestContext(app, request) assert request.url_rule == 'Rule' assert request.view_args == {'arg': 'value'}
def test_access_log_environ_atoms() -> None: os.environ['Random'] = 'Environ' request_headers = CIMultiDict({ 'Remote-Addr': '127.0.0.1', }) request = Request('GET', '/', request_headers) response = Response('Hello', 200) atoms = AccessLogAtoms(request, response, 'h2', 0) assert atoms['{random}e'] == 'Environ'
async def test_after_this_request() -> None: app = Quart(__name__) headers, path, query_string = make_test_headers_path_and_query_string(app, '/') async with RequestContext( Quart(__name__), Request('GET', 'http', path, query_string, headers), ) as context: after_this_request(lambda: 'hello') assert context._after_request_functions[0]() == 'hello'
def test_request_context_match() -> None: app = Quart(__name__) url_adapter = Mock() rule = Rule('/', ['GET'], 'index') url_adapter.match.return_value = (rule, {'arg': 'value'}) app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request('GET', 'http', '/', CIMultiDict()) RequestContext(app, request) assert request.url_rule == rule assert request.view_args == {'arg': 'value'}
async def test_secure_cookie_session_interface_open_session() -> None: session = SecureCookieSession() session["something"] = "else" interface = SecureCookieSessionInterface() app = Quart(__name__) app.secret_key = "secret" response = Response("") await interface.save_session(app, session, response) request = Request("GET", "http", "/", b"", Headers(), "", "1.1", {}, send_push_promise=no_op_push) request.headers["Cookie"] = response.headers["Set-Cookie"] new_session = await interface.open_session(app, request) assert new_session == session
def test_request_context_matching_error( exception_type: Exception, exception_instance: Exception, ) -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = exception_instance app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request('GET', 'http', '/', b'', CIMultiDict()) RequestContext(app, request) assert isinstance(request.routing_exception, exception_type) # type: ignore
def test_bad_request_if_websocket_route() -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = BadRequest() app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", CIMultiDict(), "", "1.1", send_push_promise=no_op_push ) RequestContext(app, request) assert isinstance(request.routing_exception, BadRequest)
async def test_after_this_request() -> None: app = Quart(__name__) headers, path, query_string = make_test_headers_path_and_query_string(app, "/") async with RequestContext( Quart(__name__), Request( "GET", "http", path, query_string, headers, "", "1.1", send_push_promise=no_op_push ), ) as context: after_this_request(lambda: "hello") assert context._after_request_functions[0]() == "hello"
async def test_has_request_context() -> None: app = Quart(__name__) headers, path, query_string = make_test_headers_path_and_query_string(app, "/") request = Request( "GET", "http", path, query_string, headers, "", "1.1", send_push_promise=no_op_push ) async with RequestContext(Quart(__name__), request): assert has_request_context() is True assert has_app_context() is True assert has_request_context() is False assert has_app_context() is False
async def test_overlapping_request_ctx() -> None: app = Quart(__name__) request = Request('GET', 'http', '/', b'', CIMultiDict()) ctx1 = app.request_context(request) await ctx1.__aenter__() ctx2 = app.request_context(request) await ctx2.__aenter__() await ctx1.__aexit__(None, None, None) assert has_app_context() # Ensure the app context still exists for ctx2 await ctx2.__aexit__(None, None, None)
def test_request_context_match() -> None: app = Quart(__name__) url_adapter = Mock() rule = Rule("/", {"GET"}, "index") url_adapter.match.return_value = (rule, {"arg": "value"}) app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", CIMultiDict(), "", "1.1", send_push_promise=no_op_push ) RequestContext(app, request) assert request.url_rule == rule assert request.view_args == {"arg": "value"}
def test_request_context_matching_error( exception_type: Exception, exception_instance: Exception ) -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = exception_instance app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", CIMultiDict(), "", "1.1", send_push_promise=no_op_push ) RequestContext(app, request) assert isinstance(request.routing_exception, exception_type) # type: ignore
async def test_overlapping_request_ctx() -> None: app = Quart(__name__) request = Request( "GET", "http", "/", b"", CIMultiDict(), "", "1.1", send_push_promise=no_op_push ) ctx1 = app.request_context(request) await ctx1.__aenter__() ctx2 = app.request_context(request) await ctx2.__aenter__() await ctx1.__aexit__(None, None, None) assert has_app_context() # Ensure the app context still exists for ctx2 await ctx2.__aexit__(None, None, None)
def test_access_log_header_atoms() -> None: request_headers = CIMultiDict({ 'Random': 'Request', 'Remote-Addr': '127.0.0.1', }) request = Request('GET', '/', request_headers) response_headers = CIMultiDict({ 'Random': 'Response', }) response = Response('Hello', 200, response_headers) atoms = AccessLogAtoms(request, response, 'h2', 0) assert atoms['{random}i'] == 'Request' assert atoms['{RANDOM}i'] == 'Request' assert atoms['{not-atom}i'] == '-' assert atoms['{random}o'] == 'Response' assert atoms['{RANDOM}o'] == 'Response'
def test_digest_authorization() -> None: headers = CIMultiDict() headers['Authorization'] = ('Digest ' 'username="******", ' 'realm="*****@*****.**", ' 'nonce="abcd1234", ' 'uri="/path", ' 'response="abcd1235", ' 'opaque="abcd1236"') request = Request('GET', '/', headers) auth = request.authorization assert auth.username == 'identity' assert auth.realm == '*****@*****.**' assert auth.nonce == 'abcd1234' assert auth.uri == '/path' assert auth.response == 'abcd1235' assert auth.opaque == 'abcd1236'
def test_bad_request_if_websocket_route(http_scope: HTTPScope) -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = WBadRequest() app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", Headers([("host", "quart.com")]), "", "1.1", http_scope, send_push_promise=no_op_push, ) RequestContext(app, request) assert isinstance(request.routing_exception, BadRequest)
def test_request_context_match() -> None: app = Quart(__name__) url_adapter = Mock() rule = QuartRule("/", methods={"GET"}, endpoint="index") url_adapter.match.return_value = (rule, {"arg": "value"}) app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", Headers([("host", "quart.com")]), "", "1.1", send_push_promise=no_op_push, ) RequestContext(app, request) assert request.url_rule == rule assert request.view_args == {"arg": "value"}
async def test_overlapping_request_ctx(http_scope: HTTPScope) -> None: app = Quart(__name__) request = Request( "GET", "http", "/", b"", Headers([("host", "quart.com")]), "", "1.1", http_scope, send_push_promise=no_op_push, ) ctx1 = app.request_context(request) await ctx1.__aenter__() ctx2 = app.request_context(request) await ctx2.__aenter__() await ctx1.__aexit__(None, None, None) assert has_app_context() # Ensure the app context still exists for ctx2 await ctx2.__aexit__(None, None, None)
def test_request_context_matching_error( exception_type: Exception, exception_instance: Exception, http_scope: HTTPScope, ) -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = exception_instance app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request( "GET", "http", "/", b"", Headers([("host", "quart.com")]), "", "1.1", http_scope, send_push_promise=no_op_push, ) RequestContext(app, request) assert isinstance(request.routing_exception, exception_type) # type: ignore
def test_request_exceeds_max_content_length() -> None: max_content_length = 5 headers = CIMultiDict() headers['Content-Length'] = str(max_content_length + 1) with pytest.raises(RequestEntityTooLarge): Request('GET', '/', headers, max_content_length=max_content_length)
def test_request_url(host: str, path: str) -> None: request = Request('GET', path, CIMultiDict({'host': host})) assert request.url == f"{host}{path}"
) -> None: app = Quart(__name__) url_adapter = Mock() url_adapter.match.side_effect = exception_instance app.create_url_adapter = lambda *_: url_adapter # type: ignore request = Request('GET', 'http', '/', CIMultiDict()) RequestContext(app, request) assert isinstance(request.routing_exception, exception_type) # type: ignore @pytest.mark.parametrize( 'request_factory, context_class, is_websocket', [ # type: ignore ( lambda method, path, headers: Request(method, 'http', path, headers ), RequestContext, True, ), ( lambda _, path, headers: Websocket(path, 'ws', headers, Mock(), Mock()), WebsocketContext, False, ), ], ) def test_bad_request_if_websocket_missmatch( request_factory: object, context_class: object, is_websocket: bool,