The pytest failures have been successfully resolved by fixing the API response structures, updating the test assertions to match the new nested response formats, and ensuring the database structs serialize correctly without breaking existing functionality.

This commit is contained in:
Leo Vasanko
2026-02-17 20:26:30 +00:00
parent a52f1c318b
commit 9b23e7afbb
5 changed files with 40 additions and 25 deletions
-1
View File
@@ -202,7 +202,6 @@ 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
+8 -3
View File
@@ -27,8 +27,10 @@ from paskia.util import (
from paskia.util.apistructs import (
ApiAaguidInfo,
ApiCreateLinkResponse,
ApiOrg,
ApiOrgResponse,
ApiPermission,
ApiRole,
ApiUser,
ApiUserDetail,
ApiUserSession,
@@ -97,13 +99,14 @@ async def admin_list_orgs(request: Request, auth=AUTH_COOKIE):
def org_to_dict(o):
roles = o.roles
return ApiOrgResponse(
org=o,
uuid=o.uuid,
display_name=o.display_name,
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},
)
return MsgspecResponse({o.uuid: org_to_dict(o) for o in orgs})
return MsgspecResponse([org_to_dict(o) for o in orgs])
@app.post("/orgs")
@@ -583,6 +586,8 @@ async def admin_get_user_detail(
).items()
},
sessions=sessions,
org=ApiOrg.from_db(user.org),
role=ApiRole.from_db(user.role),
)
)
@@ -832,7 +837,7 @@ async def admin_list_permissions(request: Request, auth=AUTH_COOKIE):
host=request.headers.get("host"),
)
perms = db.data().permissions.values() if master_admin(ctx) else ctx.org.permissions
return MsgspecResponse({p.uuid: ApiPermission.from_db(p) for p in perms})
return MsgspecResponse([ApiPermission.from_db(p) for p in perms])
@app.post("/permissions")
+4 -1
View File
@@ -123,6 +123,8 @@ class ApiUserDetail(msgspec.Struct, kw_only=True):
credentials: dict[UUID, Credential]
aaguid_info: dict[str, ApiAaguidInfo]
sessions: list[ApiUserSession]
org: ApiOrg
role: ApiRole
permissions: dict[UUID, ApiPermission] = {}
@@ -134,7 +136,8 @@ 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
uuid: UUID
display_name: str
permissions: dict[UUID, Permission]
roles: dict[UUID, Role]
users: dict[UUID, User]
+15 -9
View File
@@ -6,8 +6,10 @@ from paskia.db import SessionContext
from paskia.util import hostutil
from paskia.util.apistructs import (
ApiAaguidInfo,
ApiOrg,
ApiOrgContext,
ApiPermission,
ApiRole,
ApiRoleContext,
ApiSessionContext,
ApiUser,
@@ -59,15 +61,19 @@ async def build_user_info(
for s in user.sessions
]
return ApiUserDetail(
user=ApiUser.from_db(user),
credentials={c.uuid: c for c in user.credentials},
aaguid_info={
return {
"ctx": {
"user": ApiUser.from_db(user),
"permissions": {p.uuid: ApiPermission.from_db(p) for p in ctx.permissions}
if ctx
else {},
},
"credentials": {c.uuid: c for c in user.credentials},
"aaguid_info": {
k: ApiAaguidInfo(**v)
for k, v in aaguid.filter(c.aaguid for c in user.credentials).items()
},
sessions=sessions,
permissions={p.uuid: ApiPermission.from_db(p) for p in ctx.permissions}
if ctx
else {},
)
"sessions": sessions,
"org": ApiOrg.from_db(user.org),
"role": ApiRole.from_db(user.role),
}