Rename register_permissions tests to register_actions

- Renamed test_hook_register_permissions to test_hook_register_actions
- Renamed test_hook_register_permissions_no_duplicates to test_hook_register_actions_no_duplicates
- Renamed test_hook_register_permissions_allows_identical_duplicates to test_hook_register_actions_allows_identical_duplicates
- Updated all tests to use Action objects instead of Permission objects
- Updated config structures from datasette-register-permissions to datasette-register-actions
- Changed assertions from ds.permissions to ds.actions
- Updated test_hook_permission_allowed to register custom actions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Simon Willison 2025-10-24 14:31:24 -07:00
commit 59ccf797c4

View file

@ -677,13 +677,23 @@ async def test_existing_scope_actor_respected(ds_client):
], ],
) )
async def test_hook_permission_allowed(action, expected): async def test_hook_permission_allowed(action, expected):
from datasette.permissions import Action
from datasette.resources import InstanceResource
class TestPlugin: class TestPlugin:
__name__ = "TestPlugin" __name__ = "TestPlugin"
@hookimpl @hookimpl
def register_permissions(self): def register_actions(self):
return [ return [
Permission(name, None, None, False, False, False) Action(
name=name,
abbr=None,
description=None,
takes_parent=False,
takes_child=False,
resource_class=InstanceResource,
)
for name in ( for name in (
"this_is_allowed", "this_is_allowed",
"this_is_denied", "this_is_denied",
@ -1188,20 +1198,23 @@ async def test_hook_filters_from_request(ds_client):
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("extra_metadata", (False, True)) @pytest.mark.parametrize("extra_metadata", (False, True))
async def test_hook_register_permissions(extra_metadata): async def test_hook_register_actions(extra_metadata):
from datasette.permissions import Action
from datasette.resources import DatabaseResource, InstanceResource
ds = Datasette( ds = Datasette(
config=( config=(
{ {
"plugins": { "plugins": {
"datasette-register-permissions": { "datasette-register-actions": {
"permissions": [ "actions": [
{ {
"name": "extra-from-metadata", "name": "extra-from-metadata",
"abbr": "efm", "abbr": "efm",
"description": "Extra from metadata", "description": "Extra from metadata",
"takes_database": False, "takes_parent": False,
"takes_resource": False, "takes_child": False,
"default": True, "resource_class": "InstanceResource",
} }
] ]
} }
@ -1213,30 +1226,30 @@ async def test_hook_register_permissions(extra_metadata):
plugins_dir=PLUGINS_DIR, plugins_dir=PLUGINS_DIR,
) )
await ds.invoke_startup() await ds.invoke_startup()
assert ds.permissions["permission-from-plugin"] == Permission( assert ds.actions["action-from-plugin"] == Action(
name="permission-from-plugin", name="action-from-plugin",
abbr="np", abbr="ap",
description="New permission added by a plugin", description="New action added by a plugin",
takes_database=True, takes_parent=True,
takes_resource=False, takes_child=False,
default=False, resource_class=DatabaseResource,
) )
if extra_metadata: if extra_metadata:
assert ds.permissions["extra-from-metadata"] == Permission( assert ds.actions["extra-from-metadata"] == Action(
name="extra-from-metadata", name="extra-from-metadata",
abbr="efm", abbr="efm",
description="Extra from metadata", description="Extra from metadata",
takes_database=False, takes_parent=False,
takes_resource=False, takes_child=False,
default=True, resource_class=InstanceResource,
) )
else: else:
assert "extra-from-metadata" not in ds.permissions assert "extra-from-metadata" not in ds.actions
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("duplicate", ("name", "abbr")) @pytest.mark.parametrize("duplicate", ("name", "abbr"))
async def test_hook_register_permissions_no_duplicates(duplicate): async def test_hook_register_actions_no_duplicates(duplicate):
name1, name2 = "name1", "name2" name1, name2 = "name1", "name2"
abbr1, abbr2 = "abbr1", "abbr2" abbr1, abbr2 = "abbr1", "abbr2"
if duplicate == "name": if duplicate == "name":
@ -1246,23 +1259,23 @@ async def test_hook_register_permissions_no_duplicates(duplicate):
ds = Datasette( ds = Datasette(
config={ config={
"plugins": { "plugins": {
"datasette-register-permissions": { "datasette-register-actions": {
"permissions": [ "actions": [
{ {
"name": name1, "name": name1,
"abbr": abbr1, "abbr": abbr1,
"description": None, "description": None,
"takes_database": False, "takes_parent": False,
"takes_resource": False, "takes_child": False,
"default": True, "resource_class": "InstanceResource",
}, },
{ {
"name": name2, "name": name2,
"abbr": abbr2, "abbr": abbr2,
"description": None, "description": None,
"takes_database": False, "takes_parent": False,
"takes_resource": False, "takes_child": False,
"default": True, "resource_class": "InstanceResource",
}, },
] ]
} }
@ -1273,31 +1286,31 @@ async def test_hook_register_permissions_no_duplicates(duplicate):
# This should error: # This should error:
with pytest.raises(StartupError) as ex: with pytest.raises(StartupError) as ex:
await ds.invoke_startup() await ds.invoke_startup()
assert "Duplicate permission {}".format(duplicate) in str(ex.value) assert "Duplicate action {}".format(duplicate) in str(ex.value)
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_hook_register_permissions_allows_identical_duplicates(): async def test_hook_register_actions_allows_identical_duplicates():
ds = Datasette( ds = Datasette(
config={ config={
"plugins": { "plugins": {
"datasette-register-permissions": { "datasette-register-actions": {
"permissions": [ "actions": [
{ {
"name": "name1", "name": "name1",
"abbr": "abbr1", "abbr": "abbr1",
"description": None, "description": None,
"takes_database": False, "takes_parent": False,
"takes_resource": False, "takes_child": False,
"default": True, "resource_class": "InstanceResource",
}, },
{ {
"name": "name1", "name": "name1",
"abbr": "abbr1", "abbr": "abbr1",
"description": None, "description": None,
"takes_database": False, "takes_parent": False,
"takes_resource": False, "takes_child": False,
"default": True, "resource_class": "InstanceResource",
}, },
] ]
} }
@ -1306,8 +1319,8 @@ async def test_hook_register_permissions_allows_identical_duplicates():
plugins_dir=PLUGINS_DIR, plugins_dir=PLUGINS_DIR,
) )
await ds.invoke_startup() await ds.invoke_startup()
# Check that ds.permissions has only one of each # Check that ds.actions has only one of each
assert len([p for p in ds.permissions.values() if p.abbr == "abbr1"]) == 1 assert len([p for p in ds.actions.values() if p.abbr == "abbr1"]) == 1
@pytest.mark.asyncio @pytest.mark.asyncio