|
- import asyncio
- from typing import Any, AsyncGenerator, Dict
-
- import pytest
- import pytest_asyncio
- import uvicorn
- from autogen_core import ComponentModel
- from fastapi import FastAPI
- from pydantic import BaseModel, Field
-
-
- class TestArgs(BaseModel):
- query: str = Field(description="The test query")
- value: int = Field(description="A test value")
-
-
- class TestResponse(BaseModel):
- result: str = Field(description="The test result")
-
-
- # Create a test FastAPI app
- app = FastAPI()
-
-
- @app.post("/test")
- async def test_endpoint(body: TestArgs) -> TestResponse:
- return TestResponse(result=f"Received: {body.query} with value {body.value}")
-
-
- @app.post("/test/{query}/{value}")
- async def test_path_params_endpoint(query: str, value: int) -> TestResponse:
- return TestResponse(result=f"Received: {query} with value {value}")
-
-
- @app.put("/test/{query}/{value}")
- async def test_path_params_and_body_endpoint(query: str, value: int, body: Dict[str, Any]) -> TestResponse:
- return TestResponse(result=f"Received: {query} with value {value} and extra {body.get('extra')}") # type: ignore
-
-
- @app.get("/test")
- async def test_get_endpoint(query: str, value: int) -> TestResponse:
- return TestResponse(result=f"Received: {query} with value {value}")
-
-
- @app.put("/test")
- async def test_put_endpoint(body: TestArgs) -> TestResponse:
- return TestResponse(result=f"Received: {body.query} with value {body.value}")
-
-
- @app.delete("/test")
- async def test_delete_endpoint(query: str, value: int) -> TestResponse:
- return TestResponse(result=f"Received: {query} with value {value}")
-
-
- @app.patch("/test")
- async def test_patch_endpoint(body: TestArgs) -> TestResponse:
- return TestResponse(result=f"Received: {body.query} with value {body.value}")
-
-
- @pytest.fixture
- def test_config() -> ComponentModel:
- return ComponentModel(
- provider="autogen_ext.tools.http.HttpTool",
- config={
- "name": "TestHttpTool",
- "description": "A test HTTP tool",
- "scheme": "http",
- "path": "/test",
- "host": "localhost",
- "port": 8000,
- "method": "POST",
- "headers": {"Content-Type": "application/json"},
- "json_schema": {
- "type": "object",
- "properties": {
- "query": {"type": "string", "description": "The test query"},
- "value": {"type": "integer", "description": "A test value"},
- },
- "required": ["query", "value"],
- },
- },
- )
-
-
- @pytest_asyncio.fixture(scope="function") # type: ignore
- async def test_server() -> AsyncGenerator[None, None]:
- # Start the test server
- config = uvicorn.Config(app, host="127.0.0.1", port=8000, log_level="error")
- server = uvicorn.Server(config)
-
- # Create a task for the server
- server_task = asyncio.create_task(server.serve())
-
- # Wait a bit for server to start
- await asyncio.sleep(0.5) # Increased sleep time to ensure server is ready
-
- yield
-
- # Cleanup
- server.should_exit = True
- await server_task
|