diff --git a/datasette/default_magic_parameters.py b/datasette/default_magic_parameters.py index 239637e7..7a092f57 100644 --- a/datasette/default_magic_parameters.py +++ b/datasette/default_magic_parameters.py @@ -13,7 +13,7 @@ def header(key, request): def actor(key, request): if request.actor is None: - raise KeyError + raise KeyError(key) return request.actor[key] diff --git a/tests/test_stored_queries.py b/tests/test_stored_queries.py index e0b0e6c6..4e615241 100644 --- a/tests/test_stored_queries.py +++ b/tests/test_stored_queries.py @@ -5,6 +5,9 @@ import pytest from asgiref.sync import async_to_sync from bs4 import BeautifulSoup as Soup +from datasette.utils.asgi import Request +from datasette.views.database import MagicParameters + from .fixtures import make_app_client @@ -343,6 +346,27 @@ def magic_parameters_client(): yield client +@pytest.mark.parametrize( + "actor,key", + [ + (None, "id"), + (None, "name"), + ({}, "id"), + ({"id": "root"}, "name"), + ], +) +@pytest.mark.asyncio +async def test_magic_actor_missing_key(bare_ds, actor, key): + request = Request.fake("/") + request.scope["actor"] = actor + parameters = MagicParameters(f"select :_actor_{key}", {}, request, bare_ds) + + with pytest.raises(KeyError) as exc_info: + await parameters.execute_params() + + assert exc_info.value.args == (key,) + + @pytest.mark.parametrize( "magic_parameter,expected_re", [