sehastian's picture
test: refactor unit tests to support async services, S3 mocking and pytest fixtures
86c1ac6
import uuid
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from backend.app.api.deps import get_file_service, get_task_service
from backend.app.models.task import Task, TaskStatus
@pytest.fixture
def mock_file_service():
mock = MagicMock()
mock.save_upload_locally = AsyncMock(return_value="/tmp/uploads/test.mp4")
mock.get_result_path_local = MagicMock(return_value="/tmp/results/test.mp4")
mock.generate_presigned_url = AsyncMock(return_value="https://cdn.fake/video.mp4")
return mock
@pytest.mark.asyncio
async def test_detect_endpoint_sends_to_celery(client, mock_file_service):
local_mock_task_service = AsyncMock()
fixed_uuid = uuid.uuid4()
local_mock_task_service.create_task.return_value = Task(
id=fixed_uuid, status=TaskStatus.QUEUED, input_filename="test.mp4"
)
async def override_task():
return local_mock_task_service
def override_file():
return mock_file_service
from backend.app.main import app
app.dependency_overrides[get_task_service] = override_task
app.dependency_overrides[get_file_service] = override_file
with patch("backend.app.api.v1.router.celery_process_video") as mock_celery_task:
files = {"file": ("video.mp4", b"fake", "video/mp4")}
response = await client.post("/api/v1/detect", files=files)
assert response.status_code == 202
data = response.json()
assert data["status"] == "queued"
mock_celery_task.delay.assert_called_once_with(
str(fixed_uuid), "/tmp/uploads/test.mp4", "/tmp/results/test.mp4"
)
app.dependency_overrides = {}
@pytest.mark.asyncio
async def test_status_endpoint(client, mock_file_service):
target_id = uuid.uuid4()
task_obj = Task(
id=target_id,
status=TaskStatus.COMPLETED,
input_filename="test.mp4",
result_url="s3_key/video.mp4",
)
local_task_service = AsyncMock()
local_task_service.get_task.return_value = task_obj
async def override_task():
return local_task_service
def override_file():
return mock_file_service
from backend.app.main import app
app.dependency_overrides[get_task_service] = override_task
app.dependency_overrides[get_file_service] = override_file
response = await client.get(f"/api/v1/status/{target_id}")
assert response.status_code == 200
assert response.json()["result_url"] == "https://cdn.fake/video.mp4"
app.dependency_overrides = {}