Request.fake(... url_vars), plus .fake() is now documented

Also made 'from datasette import Request' shortcut work.

Closes #1697
pull/1703/head
Simon Willison 2022-03-31 19:01:58 -07:00
rodzic e73fa72917
commit 5c5e9b3657
4 zmienionych plików z 38 dodań i 2 usunięć

Wyświetl plik

@ -1,5 +1,5 @@
from datasette.version import __version_info__, __version__ # noqa
from datasette.utils.asgi import Forbidden, NotFound, Response # noqa
from datasette.utils.asgi import Forbidden, NotFound, Request, Response # noqa
from datasette.utils import actor_matches_allow # noqa
from .hookspecs import hookimpl # noqa
from .hookspecs import hookspec # noqa

Wyświetl plik

@ -118,7 +118,7 @@ class Request:
return dict(parse_qsl(body.decode("utf-8"), keep_blank_values=True))
@classmethod
def fake(cls, path_with_query_string, method="GET", scheme="http"):
def fake(cls, path_with_query_string, method="GET", scheme="http", url_vars=None):
"""Useful for constructing Request objects for tests"""
path, _, query_string = path_with_query_string.partition("?")
scope = {
@ -130,6 +130,8 @@ class Request:
"scheme": scheme,
"type": "http",
}
if url_vars:
scope["url_route"] = {"kwargs": url_vars}
return cls(scope, None)

Wyświetl plik

@ -60,6 +60,33 @@ The object also has two awaitable methods:
``await request.post_body()`` - bytes
Returns the un-parsed body of a request submitted by ``POST`` - useful for things like incoming JSON data.
And a class method that can be used to create fake request objects for use in tests:
``fake(path_with_query_string, method="GET", scheme="http", url_vars=None)``
Returns a ``Request`` instance for the specified path and method. For example:
.. code-block:: python
from datasette import Request
from pprint import pprint
request = Request.fake("/fixtures/facetable/", url_vars={
"database": "fixtures",
"table": "facetable"
})
pprint(request.scope)
This outputs::
{'http_version': '1.1',
'method': 'GET',
'path': '/fixtures/facetable/',
'query_string': b'',
'raw_path': b'/fixtures/facetable/',
'scheme': 'http',
'type': 'http',
'url_route': {'kwargs': {'database': 'fixtures', 'table': 'facetable'}}}
.. _internals_multiparams:
The MultiParams class

Wyświetl plik

@ -75,6 +75,13 @@ def test_request_args():
request.args["missing"]
def test_request_fake_url_vars():
request = Request.fake("/")
assert request.url_vars == {}
request = Request.fake("/", url_vars={"database": "fixtures"})
assert request.url_vars == {"database": "fixtures"}
def test_request_repr():
request = Request.fake("/foo?multi=1&multi=2&single=3")
assert (