From e8a3771d53fe0b16512ce83408a9e0f619b3a48d Mon Sep 17 00:00:00 2001 From: fatelei Date: Fri, 8 May 2026 18:52:33 +0800 Subject: [PATCH] chore: compatiable none list --- api/services/enterprise/rbac_service.py | 9 ++++++++- .../services/enterprise/test_rbac_service.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/api/services/enterprise/rbac_service.py b/api/services/enterprise/rbac_service.py index d48fe37cab..4b23717ccd 100644 --- a/api/services/enterprise/rbac_service.py +++ b/api/services/enterprise/rbac_service.py @@ -3,7 +3,7 @@ from __future__ import annotations from enum import StrEnum from typing import Any, Generic, TypeVar -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, field_validator from services.enterprise.base import EnterpriseRequest @@ -66,6 +66,13 @@ class RBACRole(_RBACModel): is_builtin: bool = False permission_keys: list[str] = Field(default_factory=list) + @field_validator("permission_keys", mode="before") + @classmethod + def _coerce_permission_keys(cls, value: Any) -> list[str]: + if value is None: + return [] + return value + class AccessPolicy(_RBACModel): id: str diff --git a/api/tests/unit_tests/services/enterprise/test_rbac_service.py b/api/tests/unit_tests/services/enterprise/test_rbac_service.py index 994942fb3d..9c5a818c1b 100644 --- a/api/tests/unit_tests/services/enterprise/test_rbac_service.py +++ b/api/tests/unit_tests/services/enterprise/test_rbac_service.py @@ -93,6 +93,25 @@ class TestRoles: svc.RBACService.Roles.list("tenant-1") assert _call_args(mock_send).params is None + def test_list_coerces_null_permission_keys(self, mock_send: MagicMock): + mock_send.return_value = { + "data": [ + { + "id": "role-1", + "tenant_id": "tenant-1", + "type": "workspace", + "category": "global_custom", + "name": "Owner", + "permission_keys": None, + } + ], + "pagination": None, + } + + out = svc.RBACService.Roles.list("tenant-1") + + assert out.data[0].permission_keys == [] + def test_get_passes_id_query_param(self, mock_send: MagicMock): mock_send.return_value = {"id": "role-1", "type": "workspace", "name": "Owner"} svc.RBACService.Roles.get("tenant-1", "acct-1", "role-1")