diff --git a/tests/test_server.py b/tests/test_server.py new file mode 100644 index 0000000..aa77777 --- /dev/null +++ b/tests/test_server.py @@ -0,0 +1,148 @@ +import pytest +from httpx import AsyncClient, ASGITransport +from src.core.server import MockServer +from src.models.config import ServerConfig +from src.models.endpoint import Endpoint + + +class TestMockServer: + @pytest.fixture + def config(self): + return ServerConfig(port=8888, host="127.0.0.1", offline=True) + + @pytest.fixture + def server(self, config): + return MockServer(config) + + @pytest.fixture + def sample_endpoints(self): + return [ + Endpoint( + path="/api/hello", + method="GET", + response={"status_code": 200, "body": {"message": "Hello"}} + ), + Endpoint( + path="/api/users/{id}", + method="GET", + response={ + "status_code": 200, + "body": { + "id": "{{request.path.id}}", + "name": "User {{request.path.id}}" + } + } + ), + Endpoint( + path="/api/data", + method="POST", + response={"status_code": 201, "body": {"received": "{{request.body.key}}"}} + ) + ] + + def test_register_endpoint(self, server): + endpoint = Endpoint( + path="/api/test", + method="GET", + response={"status_code": 200} + ) + server.register_endpoint(endpoint) + endpoints = server.matcher.get_endpoints() + assert len(endpoints) == 1 + + def test_register_endpoints(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + endpoints = server.matcher.get_endpoints() + assert len(endpoints) == 3 + + @pytest.mark.asyncio + async def test_handle_simple_get(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.get("/api/hello") + assert response.status_code == 200 + data = response.json() + assert data["message"] == "Hello" + + @pytest.mark.asyncio + async def test_handle_path_params(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.get("/api/users/456") + assert response.status_code == 200 + data = response.json() + assert data["id"] == "456" + assert data["name"] == "User 456" + + @pytest.mark.asyncio + async def test_handle_post_with_body(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.post("/api/data", json={"key": "test_value"}) + assert response.status_code == 201 + data = response.json() + assert data["received"] == "test_value" + + @pytest.mark.asyncio + async def test_handle_not_found(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.get("/api/nonexistent") + assert response.status_code == 404 + + @pytest.mark.asyncio + async def test_handle_method_not_allowed(self, server, sample_endpoints): + server.register_endpoints(sample_endpoints) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.post("/api/hello") + assert response.status_code == 404 + + @pytest.mark.asyncio + async def test_response_headers(self, server): + endpoint = Endpoint( + path="/api/headers", + method="GET", + response={ + "status_code": 200, + "body": {"test": "value"}, + "headers": {"X-Custom-Header": "custom-value"} + } + ) + server.register_endpoint(endpoint) + app = server._create_app() + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as client: + response = await client.get("/api/headers") + assert response.status_code == 200 + assert response.headers.get("X-Custom-Header") == "custom-value" + + def test_build_response_with_templating(self, server): + endpoint = Endpoint( + path="/api/test", + method="GET", + response={ + "status_code": 200, + "body": { + "id": "{{request.path.id}}", + "uuid": "{{uuid}}" + } + } + ) + context = { + "request": {"path": {"id": "123"}}, + "uuid": "test-uuid" + } + response = server._build_response(endpoint, context) + assert response["status_code"] == 200 + assert response["body"]["id"] == "123" + assert response["body"]["uuid"] == "test-uuid"