Skip to content

Commit 71fd073

Browse files
committed
🧪 add test case
1 parent b15c916 commit 71fd073

File tree

3 files changed

+255
-3
lines changed

3 files changed

+255
-3
lines changed

‎test/backend/app/test_tool_config_app.py‎

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,85 @@ def test_scan_tool_auth_failure(self, mock_get_user_id):
401401
assert "Failed to update tool" in data["detail"]
402402

403403

404+
class TestLoadLastToolConfigAPI:
405+
"""Test endpoint for loading last tool configuration"""
406+
407+
@patch('apps.tool_config_app.get_current_user_id')
408+
@patch('apps.tool_config_app.load_last_tool_config_impl')
409+
def test_load_last_tool_config_success(self, mock_load_config, mock_get_user_id):
410+
"""Test successful loading of last tool configuration"""
411+
mock_get_user_id.return_value = ("user123", "tenant456")
412+
mock_load_config.return_value = {"param1": "value1", "param2": "value2"}
413+
414+
response = client.get("/tool/load_config/123")
415+
416+
assert response.status_code == HTTPStatus.OK
417+
data = response.json()
418+
assert data["status"] == "success"
419+
assert data["message"] == {"param1": "value1", "param2": "value2"}
420+
421+
mock_get_user_id.assert_called_once_with(None)
422+
mock_load_config.assert_called_once_with(123, "tenant456", "user123")
423+
424+
@patch('apps.tool_config_app.get_current_user_id')
425+
@patch('apps.tool_config_app.load_last_tool_config_impl')
426+
def test_load_last_tool_config_not_found(self, mock_load_config, mock_get_user_id):
427+
"""Test loading tool config when not found"""
428+
mock_get_user_id.return_value = ("user123", "tenant456")
429+
mock_load_config.side_effect = ValueError("Tool configuration not found for tool ID: 123")
430+
431+
response = client.get("/tool/load_config/123")
432+
433+
assert response.status_code == HTTPStatus.NOT_FOUND
434+
data = response.json()
435+
assert "Tool configuration not found" in data["detail"]
436+
437+
mock_get_user_id.assert_called_once_with(None)
438+
mock_load_config.assert_called_once_with(123, "tenant456", "user123")
439+
440+
@patch('apps.tool_config_app.get_current_user_id')
441+
@patch('apps.tool_config_app.load_last_tool_config_impl')
442+
def test_load_last_tool_config_service_error(self, mock_load_config, mock_get_user_id):
443+
"""Test service error when loading tool config"""
444+
mock_get_user_id.return_value = ("user123", "tenant456")
445+
mock_load_config.side_effect = Exception("Database error")
446+
447+
response = client.get("/tool/load_config/123")
448+
449+
assert response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR
450+
data = response.json()
451+
assert "Failed to load tool config" in data["detail"]
452+
453+
mock_get_user_id.assert_called_once_with(None)
454+
mock_load_config.assert_called_once_with(123, "tenant456", "user123")
455+
456+
@patch('apps.tool_config_app.get_current_user_id')
457+
def test_load_last_tool_config_auth_error(self, mock_get_user_id):
458+
"""Test authentication error when loading tool config"""
459+
mock_get_user_id.side_effect = Exception("Auth error")
460+
461+
response = client.get("/tool/load_config/123")
462+
463+
assert response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR
464+
data = response.json()
465+
assert "Failed to load tool config" in data["detail"]
466+
467+
@patch('apps.tool_config_app.get_current_user_id')
468+
@patch('apps.tool_config_app.load_last_tool_config_impl')
469+
def test_load_last_tool_config_with_authorization_header(self, mock_load_config, mock_get_user_id):
470+
"""Test loading tool config with authorization header"""
471+
mock_get_user_id.return_value = ("user123", "tenant456")
472+
mock_load_config.return_value = {"param1": "value1"}
473+
474+
response = client.get(
475+
"/tool/load_config/123",
476+
headers={"Authorization": "Bearer test_token"}
477+
)
478+
479+
assert response.status_code == HTTPStatus.OK
480+
mock_get_user_id.assert_called_with("Bearer test_token")
481+
482+
404483
class TestDataValidation:
405484
"""Data validation tests"""
406485

‎test/backend/database/test_tool_db.py‎

Lines changed: 128 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@
7878
add_tool_field,
7979
search_tools_for_sub_agent,
8080
check_tool_is_available,
81-
delete_tools_by_agent_id
81+
delete_tools_by_agent_id,
82+
search_last_tool_instance_by_tool_id
8283
)
8384

8485
class MockToolInstance:
@@ -518,4 +519,129 @@ def test_delete_tools_by_agent_id_success(monkeypatch, mock_session):
518519
# Function returns no value, only verify successful execution
519520
delete_tools_by_agent_id(1, "tenant1", "user1")
520521

521-
mock_update.assert_called_once()
522+
mock_update.assert_called_once()
523+
524+
525+
def test_search_last_tool_instance_by_tool_id_found(monkeypatch, mock_session):
526+
"""Test successfully finding last tool instance by tool ID"""
527+
session, query = mock_session
528+
mock_tool_instance = MockToolInstance()
529+
mock_tool_instance.params = {"param1": "value1", "param2": "value2"}
530+
mock_tool_instance.update_time = "2023-01-01 12:00:00"
531+
532+
mock_first = MagicMock()
533+
mock_first.return_value = mock_tool_instance
534+
mock_order_by = MagicMock()
535+
mock_order_by.first = mock_first
536+
mock_filter = MagicMock()
537+
mock_filter.order_by.return_value = mock_order_by
538+
query.filter.return_value = mock_filter
539+
540+
mock_ctx = MagicMock()
541+
mock_ctx.__enter__.return_value = session
542+
mock_ctx.__exit__.return_value = None
543+
monkeypatch.setattr("backend.database.tool_db.get_db_session", lambda: mock_ctx)
544+
monkeypatch.setattr("backend.database.tool_db.as_dict", lambda obj: obj.__dict__)
545+
546+
result = search_last_tool_instance_by_tool_id(1, "tenant1", "user1")
547+
548+
assert result["tool_instance_id"] == 1
549+
assert result["tool_id"] == 1
550+
assert result["params"] == {"param1": "value1", "param2": "value2"}
551+
552+
def test_search_last_tool_instance_by_tool_id_not_found(monkeypatch, mock_session):
553+
"""Test searching for non-existent last tool instance"""
554+
session, query = mock_session
555+
mock_first = MagicMock()
556+
mock_first.return_value = None
557+
mock_order_by = MagicMock()
558+
mock_order_by.first = mock_first
559+
mock_filter = MagicMock()
560+
mock_filter.order_by.return_value = mock_order_by
561+
query.filter.return_value = mock_filter
562+
563+
mock_ctx = MagicMock()
564+
mock_ctx.__enter__.return_value = session
565+
mock_ctx.__exit__.return_value = None
566+
monkeypatch.setattr("backend.database.tool_db.get_db_session", lambda: mock_ctx)
567+
568+
result = search_last_tool_instance_by_tool_id(999, "tenant1", "user1")
569+
570+
assert result is None
571+
572+
def test_search_last_tool_instance_by_tool_id_with_deleted_flag(monkeypatch, mock_session):
573+
"""Test searching for tool instance with deleted flag filter"""
574+
session, query = mock_session
575+
mock_tool_instance = MockToolInstance()
576+
mock_tool_instance.delete_flag = "N"
577+
578+
mock_first = MagicMock()
579+
mock_first.return_value = mock_tool_instance
580+
mock_order_by = MagicMock()
581+
mock_order_by.first = mock_first
582+
mock_filter = MagicMock()
583+
mock_filter.order_by.return_value = mock_order_by
584+
query.filter.return_value = mock_filter
585+
586+
mock_ctx = MagicMock()
587+
mock_ctx.__enter__.return_value = session
588+
mock_ctx.__exit__.return_value = None
589+
monkeypatch.setattr("backend.database.tool_db.get_db_session", lambda: mock_ctx)
590+
monkeypatch.setattr("backend.database.tool_db.as_dict", lambda obj: obj.__dict__)
591+
592+
result = search_last_tool_instance_by_tool_id(1, "tenant1", "user1")
593+
594+
assert result["delete_flag"] == "N"
595+
# Verify that the filter was called with correct parameters
596+
assert query.filter.call_count == 1
597+
598+
def test_search_last_tool_instance_by_tool_id_ordering(monkeypatch, mock_session):
599+
"""Test that results are ordered by update_time desc"""
600+
session, query = mock_session
601+
mock_tool_instance = MockToolInstance()
602+
603+
mock_first = MagicMock()
604+
mock_first.return_value = mock_tool_instance
605+
mock_order_by = MagicMock()
606+
mock_order_by.first = mock_first
607+
mock_filter = MagicMock()
608+
mock_filter.order_by.return_value = mock_order_by
609+
query.filter.return_value = mock_filter
610+
611+
mock_ctx = MagicMock()
612+
mock_ctx.__enter__.return_value = session
613+
mock_ctx.__exit__.return_value = None
614+
monkeypatch.setattr("backend.database.tool_db.get_db_session", lambda: mock_ctx)
615+
monkeypatch.setattr("backend.database.tool_db.as_dict", lambda obj: obj.__dict__)
616+
617+
result = search_last_tool_instance_by_tool_id(1, "tenant1", "user1")
618+
619+
# Verify that order_by was called (indicating proper ordering)
620+
mock_filter.order_by.assert_called_once()
621+
assert result is not None
622+
623+
def test_search_last_tool_instance_by_tool_id_different_tenants(monkeypatch, mock_session):
624+
"""Test searching with different tenant and user IDs"""
625+
session, query = mock_session
626+
mock_tool_instance = MockToolInstance()
627+
mock_tool_instance.tenant_id = "tenant2"
628+
mock_tool_instance.user_id = "user2"
629+
630+
mock_first = MagicMock()
631+
mock_first.return_value = mock_tool_instance
632+
mock_order_by = MagicMock()
633+
mock_order_by.first = mock_first
634+
mock_filter = MagicMock()
635+
mock_filter.order_by.return_value = mock_order_by
636+
query.filter.return_value = mock_filter
637+
638+
mock_ctx = MagicMock()
639+
mock_ctx.__enter__.return_value = session
640+
mock_ctx.__exit__.return_value = None
641+
monkeypatch.setattr("backend.database.tool_db.get_db_session", lambda: mock_ctx)
642+
monkeypatch.setattr("backend.database.tool_db.as_dict", lambda obj: obj.__dict__)
643+
644+
result = search_last_tool_instance_by_tool_id(1, "tenant2", "user2")
645+
646+
assert result["tenant_id"] == "tenant2"
647+
assert result["user_id"] == "user2"

‎test/backend/services/test_tool_configuration_service.py‎

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
get_local_tools_classes,
1818
search_tool_info_impl,
1919
update_tool_info_impl,
20-
list_all_tools
20+
list_all_tools,
21+
load_last_tool_config_impl
2122
)
2223
from consts.model import ToolInfo, ToolSourceEnum, ToolInstanceInfoRequest
2324
from consts.exceptions import MCPConnectionError
@@ -1071,5 +1072,51 @@ def side_effect(*args, **kwargs):
10711072
assert "tenant_3 (error: Connection error)" in warning_call
10721073

10731074

1075+
class TestLoadLastToolConfigImpl:
1076+
"""Test load_last_tool_config_impl function"""
1077+
1078+
@patch('backend.services.tool_configuration_service.search_last_tool_instance_by_tool_id')
1079+
def test_load_last_tool_config_impl_success(self, mock_search_tool_instance):
1080+
"""Test successfully loading last tool configuration"""
1081+
mock_tool_instance = {
1082+
"tool_instance_id": 1,
1083+
"tool_id": 123,
1084+
"params": {"param1": "value1", "param2": "value2"},
1085+
"enabled": True
1086+
}
1087+
mock_search_tool_instance.return_value = mock_tool_instance
1088+
1089+
result = load_last_tool_config_impl(123, "tenant1", "user1")
1090+
1091+
assert result == {"param1": "value1", "param2": "value2"}
1092+
mock_search_tool_instance.assert_called_once_with(123, "tenant1", "user1")
1093+
1094+
@patch('backend.services.tool_configuration_service.search_last_tool_instance_by_tool_id')
1095+
def test_load_last_tool_config_impl_not_found(self, mock_search_tool_instance):
1096+
"""Test loading tool config when tool instance not found"""
1097+
mock_search_tool_instance.return_value = None
1098+
1099+
with pytest.raises(ValueError, match="Tool configuration not found for tool ID: 123"):
1100+
load_last_tool_config_impl(123, "tenant1", "user1")
1101+
1102+
mock_search_tool_instance.assert_called_once_with(123, "tenant1", "user1")
1103+
1104+
@patch('backend.services.tool_configuration_service.search_last_tool_instance_by_tool_id')
1105+
def test_load_last_tool_config_impl_empty_params(self, mock_search_tool_instance):
1106+
"""Test loading tool config with empty params"""
1107+
mock_tool_instance = {
1108+
"tool_instance_id": 1,
1109+
"tool_id": 123,
1110+
"params": {},
1111+
"enabled": True
1112+
}
1113+
mock_search_tool_instance.return_value = mock_tool_instance
1114+
1115+
result = load_last_tool_config_impl(123, "tenant1", "user1")
1116+
1117+
assert result == {}
1118+
mock_search_tool_instance.assert_called_once_with(123, "tenant1", "user1")
1119+
1120+
10741121
if __name__ == '__main__':
10751122
unittest.main()

0 commit comments

Comments
 (0)