mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
New View base class (#2080)
* New View base class, closes #2078 * Use new View subclass for PatternPortfolioView
This commit is contained in:
parent
94882aa72b
commit
8ea00e038d
4 changed files with 170 additions and 10 deletions
84
tests/test_base_view.py
Normal file
84
tests/test_base_view.py
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
from datasette.views.base import View
|
||||
from datasette import Request, Response
|
||||
from datasette.app import Datasette
|
||||
import json
|
||||
import pytest
|
||||
|
||||
|
||||
class GetView(View):
|
||||
async def get(self, request, datasette):
|
||||
return Response.json(
|
||||
{
|
||||
"absolute_url": datasette.absolute_url(request, "/"),
|
||||
"request_path": request.path,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class GetAndPostView(GetView):
|
||||
async def post(self, request, datasette):
|
||||
return Response.json(
|
||||
{
|
||||
"method": request.method,
|
||||
"absolute_url": datasette.absolute_url(request, "/"),
|
||||
"request_path": request.path,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_view():
|
||||
v = GetView()
|
||||
datasette = Datasette()
|
||||
response = await v(Request.fake("/foo"), datasette)
|
||||
assert json.loads(response.body) == {
|
||||
"absolute_url": "http://localhost/",
|
||||
"request_path": "/foo",
|
||||
}
|
||||
# Try a HEAD request
|
||||
head_response = await v(Request.fake("/foo", method="HEAD"), datasette)
|
||||
assert head_response.body == ""
|
||||
assert head_response.status == 200
|
||||
# And OPTIONS
|
||||
options_response = await v(Request.fake("/foo", method="OPTIONS"), datasette)
|
||||
assert options_response.body == "ok"
|
||||
assert options_response.status == 200
|
||||
assert options_response.headers["allow"] == "HEAD, GET"
|
||||
# And POST
|
||||
post_response = await v(Request.fake("/foo", method="POST"), datasette)
|
||||
assert post_response.body == "Method not allowed"
|
||||
assert post_response.status == 405
|
||||
# And POST with .json extension
|
||||
post_json_response = await v(Request.fake("/foo.json", method="POST"), datasette)
|
||||
assert json.loads(post_json_response.body) == {
|
||||
"ok": False,
|
||||
"error": "Method not allowed",
|
||||
}
|
||||
assert post_json_response.status == 405
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_post_view():
|
||||
v = GetAndPostView()
|
||||
datasette = Datasette()
|
||||
response = await v(Request.fake("/foo"), datasette)
|
||||
assert json.loads(response.body) == {
|
||||
"absolute_url": "http://localhost/",
|
||||
"request_path": "/foo",
|
||||
}
|
||||
# Try a HEAD request
|
||||
head_response = await v(Request.fake("/foo", method="HEAD"), datasette)
|
||||
assert head_response.body == ""
|
||||
assert head_response.status == 200
|
||||
# And OPTIONS
|
||||
options_response = await v(Request.fake("/foo", method="OPTIONS"), datasette)
|
||||
assert options_response.body == "ok"
|
||||
assert options_response.status == 200
|
||||
assert options_response.headers["allow"] == "HEAD, GET, POST"
|
||||
# And POST
|
||||
post_response = await v(Request.fake("/foo", method="POST"), datasette)
|
||||
assert json.loads(post_response.body) == {
|
||||
"method": "POST",
|
||||
"absolute_url": "http://localhost/",
|
||||
"request_path": "/foo",
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue