Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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'
Esempio n. 4
0
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'
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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'
Esempio n. 8
0
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
Esempio n. 9
0
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'}
Esempio n. 10
0
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'
Esempio n. 11
0
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'
Esempio n. 12
0
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'}
Esempio n. 13
0
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
Esempio n. 14
0
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
Esempio n. 15
0
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)
Esempio n. 16
0
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"
Esempio n. 17
0
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
Esempio n. 18
0
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)
Esempio n. 19
0
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"}
Esempio n. 20
0
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
Esempio n. 21
0
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)
Esempio n. 22
0
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'
Esempio n. 23
0
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'
Esempio n. 24
0
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)
Esempio n. 25
0
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"}
Esempio n. 26
0
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)
Esempio n. 27
0
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
Esempio n. 28
0
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)
Esempio n. 29
0
def test_request_url(host: str, path: str) -> None:
    request = Request('GET', path, CIMultiDict({'host': host}))
    assert request.url == f"{host}{path}"
Esempio n. 30
0
) -> 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,