|
50 | 50 | from google.genai import types |
51 | 51 | from pydantic import BaseModel |
52 | 52 | import pytest |
| 53 | +from google.adk.cli.fast_api import DynamicAppMap |
| 54 | +from google.adk.apps.app import App |
53 | 55 |
|
54 | 56 | # Configure logging to help diagnose server startup issues |
55 | 57 | logging.basicConfig( |
@@ -3807,3 +3809,64 @@ def test_finalize_agent_identity_credentials_api_call_error(test_app): |
3807 | 3809 |
|
3808 | 3810 | if __name__ == "__main__": |
3809 | 3811 | pytest.main(["-xvs", __file__]) |
| 3812 | + |
| 3813 | +def test_dynamic_app_map_finds_matching_app(): |
| 3814 | + mock_agent_loader = MagicMock() |
| 3815 | + mock_agent_loader.list_agents.return_value = ["folder_a", "folder_b"] |
| 3816 | + |
| 3817 | + def mock_load_agent(folder): |
| 3818 | + mock_app = MagicMock(spec=App) |
| 3819 | + if folder == "folder_b": |
| 3820 | + mock_app.name = "target_app" |
| 3821 | + else: |
| 3822 | + mock_app.name = "other_app" |
| 3823 | + return mock_app |
| 3824 | + |
| 3825 | + mock_agent_loader.load_agent.side_effect = mock_load_agent |
| 3826 | + |
| 3827 | + app_map = DynamicAppMap(mock_agent_loader) |
| 3828 | + |
| 3829 | + # Should correctly map the internal app name to its physical folder |
| 3830 | + assert app_map["target_app"] == "folder_b" |
| 3831 | + |
| 3832 | +def test_dynamic_app_map_fallback_when_not_found(): |
| 3833 | + mock_agent_loader = MagicMock() |
| 3834 | + mock_agent_loader.list_agents.return_value = ["folder_a"] |
| 3835 | + |
| 3836 | + def mock_load_agent(folder): |
| 3837 | + mock_app = MagicMock(spec=App) |
| 3838 | + mock_app.name = "other_app" |
| 3839 | + return mock_app |
| 3840 | + |
| 3841 | + mock_agent_loader.load_agent.side_effect = mock_load_agent |
| 3842 | + |
| 3843 | + app_map = DynamicAppMap(mock_agent_loader) |
| 3844 | + |
| 3845 | + # If the app isn't found, it should return the exact string it was given |
| 3846 | + assert app_map["missing_app"] == "missing_app" |
| 3847 | + |
| 3848 | +def test_dynamic_app_map_ignores_load_errors(): |
| 3849 | + mock_agent_loader = MagicMock() |
| 3850 | + mock_agent_loader.list_agents.return_value = ["broken_folder", "good_folder"] |
| 3851 | + |
| 3852 | + def mock_load_agent(folder): |
| 3853 | + if folder == "broken_folder": |
| 3854 | + raise ValueError("Agent is completely broken") |
| 3855 | + mock_app = MagicMock(spec=App) |
| 3856 | + mock_app.name = "good_app" |
| 3857 | + return mock_app |
| 3858 | + |
| 3859 | + mock_agent_loader.load_agent.side_effect = mock_load_agent |
| 3860 | + |
| 3861 | + app_map = DynamicAppMap(mock_agent_loader) |
| 3862 | + |
| 3863 | + # Should ignore the ValueError from broken_folder and still find good_app |
| 3864 | + assert app_map["good_app"] == "good_folder" |
| 3865 | + |
| 3866 | +def test_dynamic_app_map_is_truthy(): |
| 3867 | + mock_agent_loader = MagicMock() |
| 3868 | + app_map = DynamicAppMap(mock_agent_loader) |
| 3869 | + |
| 3870 | + # Must evaluate to True so that `app_map or {}` evaluates to app_map |
| 3871 | + assert bool(app_map) is True |
| 3872 | + assert (app_map or {}) is app_map |
0 commit comments