fix: require api auth in server factory

This commit is contained in:
hamb1y
2026-07-08 12:16:12 +08:00
committed by Xubin Ren
parent 6c59332a8a
commit e86133c434
4 changed files with 90 additions and 34 deletions
+20 -10
View File
@@ -26,6 +26,9 @@ except ImportError:
pytest_plugins = ("pytest_asyncio",)
API_KEY = "secret"
AUTH_HEADERS = {"Authorization": f"Bearer {API_KEY}"}
def _make_mock_agent(response_text: str = "mock response") -> MagicMock:
agent = MagicMock()
@@ -43,7 +46,7 @@ def mock_agent():
@pytest.fixture
def app(mock_agent):
return create_app(mock_agent, model_name="test-model", request_timeout=10.0)
return create_app(mock_agent, model_name="test-model", request_timeout=10.0, api_key=API_KEY)
@pytest_asyncio.fixture
@@ -192,7 +195,7 @@ async def test_multipart_upload_saves_file(aiohttp_client, mock_agent, tmp_path)
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
file_data = b"test file content"
@@ -200,6 +203,7 @@ async def test_multipart_upload_saves_file(aiohttp_client, mock_agent, tmp_path)
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
data={"message": "analyze this", "files": data},
)
assert resp.status == 200
@@ -219,7 +223,7 @@ async def test_multipart_multiple_files(aiohttp_client, mock_agent, tmp_path) ->
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
# Note: aiohttp test client has limited multipart support
@@ -229,6 +233,7 @@ async def test_multipart_multiple_files(aiohttp_client, mock_agent, tmp_path) ->
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
data={"message": "analyze", "files": data},
)
assert resp.status == 200
@@ -245,7 +250,7 @@ async def test_multipart_file_size_limit(aiohttp_client, mock_agent, tmp_path) -
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
# Create a file larger than 10MB
@@ -254,6 +259,7 @@ async def test_multipart_file_size_limit(aiohttp_client, mock_agent, tmp_path) -
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
data={"message": "analyze", "files": data},
)
assert resp.status == 413
@@ -270,7 +276,7 @@ async def test_multipart_defaults_text_when_missing(aiohttp_client, mock_agent,
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
file_data = b"content"
@@ -278,6 +284,7 @@ async def test_multipart_defaults_text_when_missing(aiohttp_client, mock_agent,
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
data={"files": data},
)
assert resp.status == 200
@@ -296,7 +303,7 @@ async def test_multipart_with_session_id(aiohttp_client, mock_agent, tmp_path) -
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
file_data = b"content"
@@ -304,6 +311,7 @@ async def test_multipart_with_session_id(aiohttp_client, mock_agent, tmp_path) -
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
data={"message": "hello", "session_id": "my-session", "files": data},
)
assert resp.status == 200
@@ -321,10 +329,11 @@ async def test_multipart_with_session_id(aiohttp_client, mock_agent, tmp_path) -
@pytest.mark.asyncio
async def test_plain_text_backward_compat(aiohttp_client, mock_agent) -> None:
"""Plain text JSON request (no media) works as before."""
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
json={"messages": [{"role": "user", "content": "hello world"}]},
)
assert resp.status == 200
@@ -344,7 +353,7 @@ async def test_json_base64_image_upload(aiohttp_client, mock_agent, tmp_path) ->
os.chdir(tmp_path)
try:
app = create_app(mock_agent, model_name="m")
app = create_app(mock_agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
# Use valid base64 for a tiny PNG (1x1 transparent pixel)
@@ -352,6 +361,7 @@ async def test_json_base64_image_upload(aiohttp_client, mock_agent, tmp_path) ->
resp = await client.post(
"/v1/chat/completions",
headers=AUTH_HEADERS,
json={
"messages": [
{
@@ -471,7 +481,7 @@ async def test_docx_upload_passes_media_path(aiohttp_client, tmp_path) -> None:
os.chdir(tmp_path)
try:
app = create_app(agent, model_name="m")
app = create_app(agent, model_name="m", api_key=API_KEY)
client = await aiohttp_client(app)
from docx import Document
@@ -486,7 +496,7 @@ async def test_docx_upload_passes_media_path(aiohttp_client, tmp_path) -> None:
data.add_field("files", buf.getvalue(), filename="report.docx",
content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document")
resp = await client.post("/v1/chat/completions", data=data)
resp = await client.post("/v1/chat/completions", headers=AUTH_HEADERS, data=data)
assert resp.status == 200
call_kwargs = agent.process_direct.call_args.kwargs
assert call_kwargs["content"] == "summarize the report"