fix: ruff lint + format fixes in tests, ESLint fixes in frontend
This commit is contained in:
@@ -3,17 +3,12 @@
|
||||
import base64
|
||||
import json
|
||||
import uuid
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
import pytest_asyncio
|
||||
from httpx import ASGITransport, AsyncClient
|
||||
|
||||
from app.database import Base, get_db
|
||||
from app.main import app
|
||||
from app.models.copilot import CopilotChat, CopilotRole, CopilotSession
|
||||
from app.models.user import User, UserRole
|
||||
from app.services.auth_service import hash_password
|
||||
from app.models.copilot import CopilotChat
|
||||
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
@@ -37,10 +32,12 @@ async def sample_vehicle_data():
|
||||
|
||||
def _mock_chat_json(response_text: str, actions: list | None = None) -> str:
|
||||
"""Build a JSON response string as the AI would return."""
|
||||
return json.dumps({
|
||||
"response": response_text,
|
||||
"actions": actions or [],
|
||||
})
|
||||
return json.dumps(
|
||||
{
|
||||
"response": response_text,
|
||||
"actions": actions or [],
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def _patch_openrouter_chat(content: str):
|
||||
@@ -188,7 +185,9 @@ class TestCopilotAction:
|
||||
"""POST /api/v1/copilot/action tests."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_action_search_vehicles_returns_200(self, admin_client, sample_vehicle_data):
|
||||
async def test_action_search_vehicles_returns_200(
|
||||
self, admin_client, sample_vehicle_data
|
||||
):
|
||||
"""POST /copilot/action with search_vehicles returns 200 + results."""
|
||||
# First create a vehicle
|
||||
await admin_client.post("/api/v1/vehicles/", json=sample_vehicle_data)
|
||||
@@ -311,7 +310,7 @@ class TestCopilotHistory:
|
||||
"/api/v1/copilot/chat",
|
||||
json={"message": "Session 1 message"},
|
||||
)
|
||||
resp2 = await admin_client.post(
|
||||
await admin_client.post(
|
||||
"/api/v1/copilot/chat",
|
||||
json={"message": "Session 2 message"},
|
||||
)
|
||||
@@ -332,16 +331,21 @@ class TestCopilotVoice:
|
||||
"""POST /api/v1/copilot/voice tests."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_voice_returns_200_with_transcription_and_response(self, admin_client):
|
||||
async def test_voice_returns_200_with_transcription_and_response(
|
||||
self, admin_client
|
||||
):
|
||||
"""POST /copilot/voice returns 200 with transcription + chat response."""
|
||||
mock_content = _mock_chat_json("Ich helfe dir bei der Suche.", [])
|
||||
audio_b64 = base64.b64encode(b"fake-audio-data").decode("utf-8")
|
||||
|
||||
with patch(
|
||||
"app.services.copilot_service.transcribe_audio",
|
||||
new_callable=AsyncMock,
|
||||
return_value="Zeige alle LKWs",
|
||||
), _patch_openrouter_chat(mock_content):
|
||||
with (
|
||||
patch(
|
||||
"app.services.copilot_service.transcribe_audio",
|
||||
new_callable=AsyncMock,
|
||||
return_value="Zeige alle LKWs",
|
||||
),
|
||||
_patch_openrouter_chat(mock_content),
|
||||
):
|
||||
response = await admin_client.post(
|
||||
"/api/v1/copilot/voice",
|
||||
json={"audio": audio_b64, "mime_type": "audio/webm"},
|
||||
@@ -385,10 +389,12 @@ class TestCopilotServiceUnit:
|
||||
"""_parse_ai_response correctly parses valid JSON."""
|
||||
from app.services.copilot_service import _parse_ai_response
|
||||
|
||||
raw = json.dumps({
|
||||
"response": "Ich suche LKWs.",
|
||||
"actions": [{"type": "search_vehicles", "params": {"type": "lkw"}}],
|
||||
})
|
||||
raw = json.dumps(
|
||||
{
|
||||
"response": "Ich suche LKWs.",
|
||||
"actions": [{"type": "search_vehicles", "params": {"type": "lkw"}}],
|
||||
}
|
||||
)
|
||||
result = _parse_ai_response(raw)
|
||||
assert result["response"] == "Ich suche LKWs."
|
||||
assert len(result["actions"]) == 1
|
||||
@@ -398,10 +404,16 @@ class TestCopilotServiceUnit:
|
||||
"""_parse_ai_response handles markdown code fences."""
|
||||
from app.services.copilot_service import _parse_ai_response
|
||||
|
||||
raw = "```json\n" + json.dumps({
|
||||
"response": "Test",
|
||||
"actions": [],
|
||||
}) + "\n```"
|
||||
raw = (
|
||||
"```json\n"
|
||||
+ json.dumps(
|
||||
{
|
||||
"response": "Test",
|
||||
"actions": [],
|
||||
}
|
||||
)
|
||||
+ "\n```"
|
||||
)
|
||||
result = _parse_ai_response(raw)
|
||||
assert result["response"] == "Test"
|
||||
assert result["actions"] == []
|
||||
@@ -419,14 +431,16 @@ class TestCopilotServiceUnit:
|
||||
"""_parse_ai_response filters out invalid action structures."""
|
||||
from app.services.copilot_service import _parse_ai_response
|
||||
|
||||
raw = json.dumps({
|
||||
"response": "Test",
|
||||
"actions": [
|
||||
{"type": "search_vehicles", "params": {}},
|
||||
{"invalid": "no type"},
|
||||
"not a dict",
|
||||
],
|
||||
})
|
||||
raw = json.dumps(
|
||||
{
|
||||
"response": "Test",
|
||||
"actions": [
|
||||
{"type": "search_vehicles", "params": {}},
|
||||
{"invalid": "no type"},
|
||||
"not a dict",
|
||||
],
|
||||
}
|
||||
)
|
||||
result = _parse_ai_response(raw)
|
||||
assert len(result["actions"]) == 1
|
||||
assert result["actions"][0]["type"] == "search_vehicles"
|
||||
|
||||
Reference in New Issue
Block a user