import os import unittest from unittest.mock import MagicMock, patch from crewai.cli.plus_api import PlusAPI class TestPlusAPI(unittest.TestCase): def setUp(self) -> None: self.api_key = "test_api_key" self.api = PlusAPI(self.api_key) def test_init(self) -> None: assert self.api.api_key == self.api_key assert self.api.headers["Authorization"] == f"Bearer {self.api_key}" assert self.api.headers["Content-Type"] == "application/json" assert "CrewAI-CLI/" in self.api.headers["User-Agent"] assert self.api.headers["X-Crewai-Version"] @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_login_to_tool_repository(self, mock_make_request) -> None: mock_response = MagicMock() mock_make_request.return_value = mock_response response = self.api.login_to_tool_repository() mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/tools/login", ) assert response == mock_response @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_get_tool(self, mock_make_request) -> None: mock_response = MagicMock() mock_make_request.return_value = mock_response response = self.api.get_tool("test_tool_handle") mock_make_request.assert_called_once_with( "GET", "/crewai_plus/api/v1/tools/test_tool_handle", ) assert response == mock_response @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_publish_tool(self, mock_make_request) -> None: mock_response = MagicMock() mock_make_request.return_value = mock_response handle = "test_tool_handle" public = True version = "1.0.0" description = "Test tool description" encoded_file = "encoded_test_file" response = self.api.publish_tool( handle, public, version, description, encoded_file, ) params = { "handle": handle, "public": public, "version": version, "file": encoded_file, "description": description, } mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/tools", json=params, ) assert response == mock_response @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_publish_tool_without_description(self, mock_make_request) -> None: mock_response = MagicMock() mock_make_request.return_value = mock_response handle = "test_tool_handle" public = False version = "2.0.0" description = None encoded_file = "encoded_test_file" response = self.api.publish_tool( handle, public, version, description, encoded_file, ) params = { "handle": handle, "public": public, "version": version, "file": encoded_file, "description": description, } mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/tools", json=params, ) assert response == mock_response @patch("crewai.cli.plus_api.requests.Session") def test_make_request(self, mock_session) -> None: mock_response = MagicMock() mock_session_instance = mock_session.return_value mock_session_instance.request.return_value = mock_response response = self.api._make_request("GET", "test_endpoint") mock_session.assert_called_once() mock_session_instance.request.assert_called_once_with( "GET", f"{self.api.base_url}/test_endpoint", headers=self.api.headers, ) mock_session_instance.trust_env = False assert response == mock_response @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_deploy_by_name(self, mock_make_request) -> None: self.api.deploy_by_name("test_project") mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/crews/by-name/test_project/deploy", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_deploy_by_uuid(self, mock_make_request) -> None: self.api.deploy_by_uuid("test_uuid") mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/crews/test_uuid/deploy", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_crew_status_by_name(self, mock_make_request) -> None: self.api.crew_status_by_name("test_project") mock_make_request.assert_called_once_with( "GET", "/crewai_plus/api/v1/crews/by-name/test_project/status", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_crew_status_by_uuid(self, mock_make_request) -> None: self.api.crew_status_by_uuid("test_uuid") mock_make_request.assert_called_once_with( "GET", "/crewai_plus/api/v1/crews/test_uuid/status", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_crew_by_name(self, mock_make_request) -> None: self.api.crew_by_name("test_project") mock_make_request.assert_called_once_with( "GET", "/crewai_plus/api/v1/crews/by-name/test_project/logs/deployment", ) self.api.crew_by_name("test_project", "custom_log") mock_make_request.assert_called_with( "GET", "/crewai_plus/api/v1/crews/by-name/test_project/logs/custom_log", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_crew_by_uuid(self, mock_make_request) -> None: self.api.crew_by_uuid("test_uuid") mock_make_request.assert_called_once_with( "GET", "/crewai_plus/api/v1/crews/test_uuid/logs/deployment", ) self.api.crew_by_uuid("test_uuid", "custom_log") mock_make_request.assert_called_with( "GET", "/crewai_plus/api/v1/crews/test_uuid/logs/custom_log", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_delete_crew_by_name(self, mock_make_request) -> None: self.api.delete_crew_by_name("test_project") mock_make_request.assert_called_once_with( "DELETE", "/crewai_plus/api/v1/crews/by-name/test_project", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_delete_crew_by_uuid(self, mock_make_request) -> None: self.api.delete_crew_by_uuid("test_uuid") mock_make_request.assert_called_once_with( "DELETE", "/crewai_plus/api/v1/crews/test_uuid", ) @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_list_crews(self, mock_make_request) -> None: self.api.list_crews() mock_make_request.assert_called_once_with("GET", "/crewai_plus/api/v1/crews") @patch("crewai.cli.plus_api.PlusAPI._make_request") def test_create_crew(self, mock_make_request) -> None: payload = {"name": "test_crew"} self.api.create_crew(payload) mock_make_request.assert_called_once_with( "POST", "/crewai_plus/api/v1/crews", json=payload, ) @patch.dict(os.environ, {"CREWAI_BASE_URL": "https://custom-url.com/api"}) def test_custom_base_url(self) -> None: custom_api = PlusAPI("test_key") assert custom_api.base_url == "https://custom-url.com/api"