修复了一些错误 更新了AI.md(给ai看的)
This commit is contained in:
137
oss/tests/test_http_api.py
Normal file
137
oss/tests/test_http_api.py
Normal file
@@ -0,0 +1,137 @@
|
||||
Tests for HTTP API
|
||||
|
||||
import json
|
||||
import pytest
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from oss.config import get_config
|
||||
from oss.logger.logger import Log
|
||||
from store.@{NebulaShell}.http-api.server import HttpServer, Request, Response
|
||||
from store.@{NebulaShell}.http-api.middleware import MiddlewareChain, CorsMiddleware, AuthMiddleware, LoggerMiddleware
|
||||
|
||||
|
||||
class TestRequest:
|
||||
req = Request("GET", "/test", {"Content-Type": "application/json"}, '{"test": true}')
|
||||
|
||||
assert req.method == "GET"
|
||||
assert req.path == "/test"
|
||||
assert req.headers == {"Content-Type": "application/json"}
|
||||
assert req.body == '{"test": true}'
|
||||
assert req.path_params == {}
|
||||
|
||||
|
||||
class TestResponse:
|
||||
resp = Response()
|
||||
|
||||
assert resp.status == 200
|
||||
assert resp.headers == {}
|
||||
assert resp.body == ""
|
||||
|
||||
def test_response_initialization_with_params(self):
|
||||
|
||||
@pytest.fixture
|
||||
def mock_router(self):
|
||||
return MiddlewareChain()
|
||||
|
||||
def test_http_server_initialization(self, mock_router, middleware_chain):
|
||||
server = HttpServer(mock_router, middleware_chain, host="127.0.0.1", port=9000)
|
||||
|
||||
assert server.host == "127.0.0.1"
|
||||
assert server.port == 9000
|
||||
|
||||
@patch('store.@{NebulaShell}.http-api.server.HTTPServer')
|
||||
def test_http_server_start(self, mock_http_server, mock_router, middleware_chain):
|
||||
server = HttpServer(mock_router, middleware_chain)
|
||||
|
||||
mock_server_instance = Mock()
|
||||
server._server = mock_server_instance
|
||||
|
||||
server.stop()
|
||||
|
||||
mock_server_instance.shutdown.assert_called_once()
|
||||
|
||||
|
||||
class TestMiddleware:
|
||||
from store.@{NebulaShell}.http-api.middleware import Middleware
|
||||
|
||||
class TestMiddleware(Middleware):
|
||||
def process(self, ctx, next_fn):
|
||||
return next_fn()
|
||||
|
||||
middleware = TestMiddleware()
|
||||
ctx = {}
|
||||
next_fn = Mock(return_value=None)
|
||||
|
||||
result = middleware.process(ctx, next_fn)
|
||||
|
||||
next_fn.assert_called_once()
|
||||
assert result is None
|
||||
|
||||
def test_cors_middleware_process(self):
|
||||
middleware = AuthMiddleware()
|
||||
ctx = {"request": Request("GET", "/api/test", {}, "")}
|
||||
next_fn = Mock(return_value=None)
|
||||
|
||||
with patch('store.@{NebulaShell}.http-api.middleware.get_config') as mock_get_config:
|
||||
mock_get_config.return_value.get.return_value = ""
|
||||
|
||||
result = middleware.process(ctx, next_fn)
|
||||
|
||||
next_fn.assert_called_once()
|
||||
assert result is None
|
||||
|
||||
def test_auth_middleware_process_public_path(self):
|
||||
middleware = AuthMiddleware()
|
||||
ctx = {"request": Request("GET", "/api/test", {"Authorization": "Bearer test-key"}, "")}
|
||||
next_fn = Mock(return_value=None)
|
||||
|
||||
with patch('store.@{NebulaShell}.http-api.middleware.get_config') as mock_get_config:
|
||||
mock_get_config.return_value.get.return_value = "test-key"
|
||||
|
||||
result = middleware.process(ctx, next_fn)
|
||||
|
||||
next_fn.assert_called_once()
|
||||
assert result is None
|
||||
|
||||
def test_auth_middleware_process_with_invalid_token(self):
|
||||
middleware = LoggerMiddleware()
|
||||
ctx = {"request": Request("GET", "/api/test", {}, "")}
|
||||
next_fn = Mock(return_value=None)
|
||||
|
||||
with patch.object(Log, 'info') as mock_log:
|
||||
result = middleware.process(ctx, next_fn)
|
||||
|
||||
next_fn.assert_called_once()
|
||||
mock_log.assert_called_once_with("http-api", "GET /api/test")
|
||||
assert result is None
|
||||
|
||||
def test_logger_middleware_process_silent_path(self):
|
||||
|
||||
def test_middleware_chain_initialization(self):
|
||||
chain = MiddlewareChain()
|
||||
initial_count = len(chain.middlewares)
|
||||
|
||||
mock_middleware = Mock()
|
||||
chain.add(mock_middleware)
|
||||
|
||||
assert len(chain.middlewares) == initial_count + 1
|
||||
assert chain.middlewares[-1] is mock_middleware
|
||||
|
||||
def test_middleware_chain_run(self):
|
||||
chain = MiddlewareChain()
|
||||
ctx = {}
|
||||
|
||||
response = Response(status=401, body='{"error": "Unauthorized"}')
|
||||
chain.middlewares[0].process = Mock(return_value=response)
|
||||
|
||||
result = chain.run(ctx)
|
||||
|
||||
chain.middlewares[0].process.assert_called_once()
|
||||
for middleware in chain.middlewares[1:]:
|
||||
middleware.process.assert_not_called()
|
||||
|
||||
assert result is response
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pytest.main([__file__, '-v'])
|
||||
Reference in New Issue
Block a user