diff --git a/api/libs/workspace_permission.py b/api/libs/workspace_permission.py index 2239bc8b7a..08b6cf35b2 100644 --- a/api/libs/workspace_permission.py +++ b/api/libs/workspace_permission.py @@ -23,7 +23,8 @@ def check_workspace_member_invite_permission(workspace_id: str) -> None: Check if workspace allows member invitations at both billing and policy levels. Checks performed: - 1. Enterprise policy level - Admin-configured workspace permission + 1. Billing/plan level - For future expansion (currently no plan-level restriction) + 2. Enterprise policy level - Admin-configured workspace permission Args: workspace_id: The workspace ID to check permissions for diff --git a/api/tests/unit_tests/libs/test_workspace_permission.py b/api/tests/unit_tests/libs/test_workspace_permission.py index da1e39ce8f..f30e762c63 100644 --- a/api/tests/unit_tests/libs/test_workspace_permission.py +++ b/api/tests/unit_tests/libs/test_workspace_permission.py @@ -13,18 +13,16 @@ class TestWorkspacePermissionHelper: """Test workspace permission helper functions.""" @patch("libs.workspace_permission.dify_config") - @patch("libs.workspace_permission.FeatureService") - def test_community_edition_allows_invite(self, mock_feature_service, mock_config): - """Community edition should always allow invitations without calling enterprise service.""" + @patch("libs.workspace_permission.EnterpriseService") + def test_community_edition_allows_invite(self, mock_enterprise_service, mock_config): + """Community edition should always allow invitations without calling any service.""" mock_config.ENTERPRISE_ENABLED = False - mock_features = Mock() - mock_feature_service.get_features.return_value = mock_features # Should not raise check_workspace_member_invite_permission("test-workspace-id") - # FeatureService should be called but EnterpriseService should not - mock_feature_service.get_features.assert_called_once_with("test-workspace-id") + # EnterpriseService should NOT be called in community edition + mock_enterprise_service.WorkspacePermission.get_permission.assert_not_called() @patch("libs.workspace_permission.dify_config") @patch("libs.workspace_permission.FeatureService") @@ -42,12 +40,9 @@ class TestWorkspacePermissionHelper: @patch("libs.workspace_permission.EnterpriseService") @patch("libs.workspace_permission.dify_config") - @patch("libs.workspace_permission.FeatureService") - def test_enterprise_blocks_invite_when_disabled(self, mock_feature_service, mock_config, mock_enterprise_service): + def test_enterprise_blocks_invite_when_disabled(self, mock_config, mock_enterprise_service): """Enterprise edition should block invitations when workspace policy is False.""" mock_config.ENTERPRISE_ENABLED = True - mock_features = Mock() - mock_feature_service.get_features.return_value = mock_features mock_permission = Mock() mock_permission.allow_member_invite = False @@ -60,12 +55,9 @@ class TestWorkspacePermissionHelper: @patch("libs.workspace_permission.EnterpriseService") @patch("libs.workspace_permission.dify_config") - @patch("libs.workspace_permission.FeatureService") - def test_enterprise_allows_invite_when_enabled(self, mock_feature_service, mock_config, mock_enterprise_service): + def test_enterprise_allows_invite_when_enabled(self, mock_config, mock_enterprise_service): """Enterprise edition should allow invitations when workspace policy is True.""" mock_config.ENTERPRISE_ENABLED = True - mock_features = Mock() - mock_feature_service.get_features.return_value = mock_features mock_permission = Mock() mock_permission.allow_member_invite = True @@ -135,14 +127,9 @@ class TestWorkspacePermissionHelper: @patch("libs.workspace_permission.logger") @patch("libs.workspace_permission.EnterpriseService") @patch("libs.workspace_permission.dify_config") - @patch("libs.workspace_permission.FeatureService") - def test_enterprise_service_error_fails_open( - self, mock_feature_service, mock_config, mock_enterprise_service, mock_logger - ): + def test_enterprise_service_error_fails_open(self, mock_config, mock_enterprise_service, mock_logger): """On enterprise service error, should fail-open (allow) and log error.""" mock_config.ENTERPRISE_ENABLED = True - mock_features = Mock() - mock_feature_service.get_features.return_value = mock_features # Simulate enterprise service error mock_enterprise_service.WorkspacePermission.get_permission.side_effect = Exception("Service unavailable") @@ -151,5 +138,5 @@ class TestWorkspacePermissionHelper: check_workspace_member_invite_permission("test-workspace-id") # Should log the error - mock_logger.error.assert_called_once() - assert "Failed to check workspace invite permission" in str(mock_logger.error.call_args) + mock_logger.exception.assert_called_once() + assert "Failed to check workspace invite permission" in str(mock_logger.exception.call_args)