datasette/tests/test_base_view.py
Simon Willison e889403d3b
Upgrade to ruff>=0.16.0 (#2857)
* ruff>=0.16.0

See https://astral.sh/blog/ruff-v0.16.0

* uv run ruff check . --fix --unsafe-fixes

* Ruff fixes by Claude Code Opus 5
2026-07-25 15:47:08 -07:00

88 lines
2.8 KiB
Python

import json
import pytest
from datasette import Request, Response
from datasette.app import Datasette
from datasette.views.base import View
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",
"errors": ["Method not allowed"],
"status": 405,
}
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",
}