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
8485class 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"
0 commit comments