From d6abc7f52c0602016dc5bdb0809264c281f5aac4 Mon Sep 17 00:00:00 2001 From: L1nSn0w Date: Fri, 13 Feb 2026 16:26:52 +0800 Subject: [PATCH] feat(api): enhance account registration process with improved error handling Implemented better error handling during account addition to the default workspace for enterprise users, ensuring smoother user registration experience even when workspace joining fails. --- .../enterprise/test_enterprise_service.py | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 api/tests/unit_tests/services/enterprise/test_enterprise_service.py diff --git a/api/tests/unit_tests/services/enterprise/test_enterprise_service.py b/api/tests/unit_tests/services/enterprise/test_enterprise_service.py new file mode 100644 index 0000000000..b4201aa061 --- /dev/null +++ b/api/tests/unit_tests/services/enterprise/test_enterprise_service.py @@ -0,0 +1,125 @@ +"""Unit tests for enterprise service integrations. + +This module covers the enterprise-only default workspace auto-join behavior: +- Enterprise mode disabled: no external calls +- Successful join / skipped join: no errors +- Failures (network/invalid response/invalid UUID): soft-fail wrapper must not raise +""" + +from unittest.mock import patch + +import pytest + +from services.enterprise.enterprise_service import ( + DefaultWorkspaceJoinResult, + EnterpriseService, + try_join_default_workspace, +) + + +class TestJoinDefaultWorkspace: + def test_join_default_workspace_success(self): + account_id = "11111111-1111-1111-1111-111111111111" + response = {"workspace_id": "22222222-2222-2222-2222-222222222222", "joined": True, "message": "ok"} + + with patch("services.enterprise.enterprise_service.EnterpriseRequest.send_request") as mock_send_request: + mock_send_request.return_value = response + + result = EnterpriseService.join_default_workspace(account_id=account_id) + + assert isinstance(result, DefaultWorkspaceJoinResult) + assert result.workspace_id == response["workspace_id"] + assert result.joined is True + assert result.message == "ok" + + mock_send_request.assert_called_once_with( + "POST", + "/default-workspace/members", + json={"account_id": account_id}, + ) + + def test_join_default_workspace_invalid_response_format_raises(self): + account_id = "11111111-1111-1111-1111-111111111111" + + with patch("services.enterprise.enterprise_service.EnterpriseRequest.send_request") as mock_send_request: + mock_send_request.return_value = "not-a-dict" + + with pytest.raises(ValueError, match="Invalid response format"): + EnterpriseService.join_default_workspace(account_id=account_id) + + def test_join_default_workspace_invalid_account_id_raises(self): + with pytest.raises(ValueError): + EnterpriseService.join_default_workspace(account_id="not-a-uuid") + + +class TestTryJoinDefaultWorkspace: + def test_try_join_default_workspace_enterprise_disabled_noop(self): + with ( + patch("services.enterprise.enterprise_service.dify_config") as mock_config, + patch("services.enterprise.enterprise_service.EnterpriseService.join_default_workspace") as mock_join, + ): + mock_config.ENTERPRISE_ENABLED = False + + try_join_default_workspace("11111111-1111-1111-1111-111111111111") + + mock_join.assert_not_called() + + def test_try_join_default_workspace_successful_join_does_not_raise(self): + account_id = "11111111-1111-1111-1111-111111111111" + + with ( + patch("services.enterprise.enterprise_service.dify_config") as mock_config, + patch("services.enterprise.enterprise_service.EnterpriseService.join_default_workspace") as mock_join, + ): + mock_config.ENTERPRISE_ENABLED = True + mock_join.return_value = DefaultWorkspaceJoinResult( + workspace_id="22222222-2222-2222-2222-222222222222", + joined=True, + message="ok", + ) + + # Should not raise + try_join_default_workspace(account_id) + + mock_join.assert_called_once_with(account_id=account_id) + + def test_try_join_default_workspace_skipped_join_does_not_raise(self): + account_id = "11111111-1111-1111-1111-111111111111" + + with ( + patch("services.enterprise.enterprise_service.dify_config") as mock_config, + patch("services.enterprise.enterprise_service.EnterpriseService.join_default_workspace") as mock_join, + ): + mock_config.ENTERPRISE_ENABLED = True + mock_join.return_value = DefaultWorkspaceJoinResult( + workspace_id="", + joined=False, + message="no default workspace configured", + ) + + # Should not raise + try_join_default_workspace(account_id) + + mock_join.assert_called_once_with(account_id=account_id) + + def test_try_join_default_workspace_api_failure_soft_fails(self): + account_id = "11111111-1111-1111-1111-111111111111" + + with ( + patch("services.enterprise.enterprise_service.dify_config") as mock_config, + patch("services.enterprise.enterprise_service.EnterpriseService.join_default_workspace") as mock_join, + ): + mock_config.ENTERPRISE_ENABLED = True + mock_join.side_effect = Exception("network failure") + + # Should not raise + try_join_default_workspace(account_id) + + mock_join.assert_called_once_with(account_id=account_id) + + def test_try_join_default_workspace_invalid_account_id_soft_fails(self): + with patch("services.enterprise.enterprise_service.dify_config") as mock_config: + mock_config.ENTERPRISE_ENABLED = True + + # Should not raise even though UUID parsing fails inside join_default_workspace + try_join_default_workspace("not-a-uuid")