From 3e364e0b6fcb97a052a20df8e48641107aef7e43 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Tue, 17 Feb 2026 22:50:12 +0000 Subject: [PATCH] Fix all remaining problems, pytest passing. --- paskia/db/structs.py | 1 + paskia/fastapi/admin.py | 2 +- paskia/util/apistructs.py | 2 +- tests/test_admin.py | 18 ++++++++++-------- tests/test_api.py | 9 ++++----- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/paskia/db/structs.py b/paskia/db/structs.py index 0f1daf6..2e49f38 100644 --- a/paskia/db/structs.py +++ b/paskia/db/structs.py @@ -202,6 +202,7 @@ class User(msgspec.Struct, dict=True, omit_defaults=True, kw_only=True): Immutable fields: created_at (set at creation, never modified) uuid is derived from created_at using uuid7. """ + display_name: str role_uuid: UUID = msgspec.field(name="role") created_at: datetime diff --git a/paskia/fastapi/admin.py b/paskia/fastapi/admin.py index fae1e13..f74c485 100644 --- a/paskia/fastapi/admin.py +++ b/paskia/fastapi/admin.py @@ -99,7 +99,7 @@ async def admin_list_orgs(request: Request, auth=AUTH_COOKIE): def org_to_dict(o): roles = o.roles return ApiOrgResponse( - org=o, + org=ApiOrg.from_db(o), permissions={p.uuid: p for p in o.permissions}, roles={r.uuid: r for r in roles}, users={u.uuid: u for r in roles for u in r.users}, diff --git a/paskia/util/apistructs.py b/paskia/util/apistructs.py index 7c48eea..dbf937a 100644 --- a/paskia/util/apistructs.py +++ b/paskia/util/apistructs.py @@ -136,7 +136,7 @@ class ApiUserDetail(msgspec.Struct, kw_only=True): class ApiOrgResponse(msgspec.Struct, kw_only=True): """Org response containing Org with roles and users as UUID-keyed dicts.""" - org: Org + org: ApiOrg permissions: dict[UUID, Permission] roles: dict[UUID, Role] users: dict[UUID, User] diff --git a/tests/test_admin.py b/tests/test_admin.py index 37a44ee..7ff8fc0 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -244,14 +244,16 @@ class TestAdminOrganizations: ) assert response.status_code == 200 data = response.json() - assert isinstance(data, list) + assert isinstance(data, dict) assert len(data) >= 1 # Check org structure - org = data[0] + org_data = list(data.values())[0] + assert "org" in org_data + org = org_data["org"] assert "uuid" in org assert "display_name" in org - assert "roles" in org - assert "users" in org + assert "roles" in org_data + assert "users" in org_data @pytest.mark.asyncio async def test_list_orgs_with_org_admin( @@ -269,7 +271,7 @@ class TestAdminOrganizations: assert response.status_code == 200 data = response.json() # Should only see their own org, not the second org - org_uuids = [o["uuid"] for o in data] + org_uuids = [org_data["org"]["uuid"] for org_data in data.values()] assert str(test_org.uuid) in org_uuids @pytest.mark.asyncio @@ -1399,9 +1401,9 @@ class TestAdminPermissions: ) assert response.status_code == 200 data = response.json() - assert isinstance(data, list) + assert isinstance(data, dict) # Should include at least auth:admin - perm_scopes = [p["scope"] for p in data] + perm_scopes = [p["scope"] for p in data.values()] assert "auth:admin" in perm_scopes @pytest.mark.asyncio @@ -1420,7 +1422,7 @@ class TestAdminPermissions: assert response.status_code == 200 data = response.json() # Should only see permissions the org can grant - perm_scopes = [p["scope"] for p in data] + perm_scopes = [p["scope"] for p in data.values()] assert grantable_permission.scope in perm_scopes # test_org CAN grant auth:admin (it's in org.permissions), so org admin sees it assert "auth:admin" in perm_scopes diff --git a/tests/test_api.py b/tests/test_api.py index d83cf2b..4fb1b22 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -249,9 +249,9 @@ class TestUserInfoEndpoint: ) assert response.status_code == 200 data = response.json() - assert "ctx" in data - assert data["ctx"]["user"]["uuid"] == str(test_user.uuid) - assert data["ctx"]["user"]["display_name"] == test_user.display_name + assert "user" in data + assert data["user"]["uuid"] == str(test_user.uuid) + assert data["user"]["display_name"] == test_user.display_name @pytest.mark.asyncio async def test_user_info_includes_credentials( @@ -292,8 +292,7 @@ class TestUserInfoEndpoint: ) assert response.status_code == 200 data = response.json() - assert "ctx" in data - assert "permissions" in data["ctx"] + assert "permissions" in data class TestSetSessionEndpoint: