refactor: Introduce utility functions for exception handling and database operations; update auth and playlist services to use new exception methods
All checks were successful
Backend CI / test (push) Successful in 3m58s

This commit is contained in:
JSC
2025-07-31 13:28:06 +02:00
parent f24698e3ff
commit b8346ab667
9 changed files with 679 additions and 122 deletions

View File

@@ -9,6 +9,12 @@ from fastapi import FastAPI
from app.models.sound import Sound
from app.models.user import User
from app.api.v1.sounds import get_vlc_player, get_sound_repository, get_credit_service
from app.utils.test_helpers import (
override_dependencies,
create_mock_vlc_services,
configure_mock_sound_play_success,
create_mock_vlc_stop_result,
)
@@ -24,34 +30,29 @@ class TestVLCEndpoints:
authenticated_user: User,
):
"""Test successful sound playback via VLC."""
# Set up mocks
mock_vlc_service = AsyncMock()
mock_repo = AsyncMock()
mock_credit_service = AsyncMock()
# Set up mocks using helper
mocks = create_mock_vlc_services()
# Set up test data
mock_sound = Sound(
id=1,
type="SDB",
name="Test Sound",
filename="test.mp3",
duration=5000,
size=1024,
hash="test_hash",
)
# Configure mocks for successful play
sound_data = {
"id": 1,
"type": "SDB",
"name": "Test Sound",
"filename": "test.mp3",
"duration": 5000,
"size": 1024,
"hash": "test_hash",
}
configure_mock_sound_play_success(mocks, sound_data)
# Configure mocks
mock_repo.get_by_id.return_value = mock_sound
mock_credit_service.validate_and_reserve_credits.return_value = None
mock_credit_service.deduct_credits.return_value = None
mock_vlc_service.play_sound.return_value = True
# Use dependency override helper
overrides = {
get_vlc_player: lambda: mocks["vlc_service"],
get_sound_repository: lambda: mocks["sound_repository"],
get_credit_service: lambda: mocks["credit_service"],
}
# Override dependencies
test_app.dependency_overrides[get_vlc_player] = lambda: mock_vlc_service
test_app.dependency_overrides[get_sound_repository] = lambda: mock_repo
test_app.dependency_overrides[get_credit_service] = lambda: mock_credit_service
try:
async with override_dependencies(test_app, overrides):
response = await authenticated_client.post("/api/v1/sounds/vlc/play/1")
assert response.status_code == 200
@@ -61,13 +62,8 @@ class TestVLCEndpoints:
assert "Test Sound" in data["message"]
# Verify service calls
mock_repo.get_by_id.assert_called_once_with(1)
mock_vlc_service.play_sound.assert_called_once_with(mock_sound)
finally:
# Clean up dependency overrides (except get_db which is needed for other tests)
test_app.dependency_overrides.pop(get_vlc_player, None)
test_app.dependency_overrides.pop(get_sound_repository, None)
test_app.dependency_overrides.pop(get_credit_service, None)
mocks["sound_repository"].get_by_id.assert_called_once_with(1)
mocks["vlc_service"].play_sound.assert_called_once()
@pytest.mark.asyncio
async def test_play_sound_with_vlc_sound_not_found(
@@ -199,21 +195,20 @@ class TestVLCEndpoints:
authenticated_user: User,
):
"""Test successful stopping of all VLC instances."""
# Set up mock
# Set up mock using helper
mock_vlc_service = AsyncMock()
mock_result = {
"success": True,
"processes_found": 3,
"processes_killed": 3,
"processes_remaining": 0,
"message": "Killed 3 VLC processes",
}
mock_result = create_mock_vlc_stop_result(
success=True,
processes_found=3,
processes_killed=3,
processes_remaining=0
)
mock_vlc_service.stop_all_vlc_instances.return_value = mock_result
# Override dependency
test_app.dependency_overrides[get_vlc_player] = lambda: mock_vlc_service
# Use dependency override helper
overrides = {get_vlc_player: lambda: mock_vlc_service}
try:
async with override_dependencies(test_app, overrides):
response = await authenticated_client.post("/api/v1/sounds/vlc/stop-all")
assert response.status_code == 200
@@ -226,9 +221,6 @@ class TestVLCEndpoints:
# Verify service call
mock_vlc_service.stop_all_vlc_instances.assert_called_once()
finally:
# Clean up dependency override
test_app.dependency_overrides.pop(get_vlc_player, None)
@pytest.mark.asyncio
async def test_stop_all_vlc_instances_no_processes(
@@ -238,20 +230,20 @@ class TestVLCEndpoints:
authenticated_user: User,
):
"""Test stopping VLC instances when none are running."""
# Set up mock
# Set up mock using helper
mock_vlc_service = AsyncMock()
mock_result = {
"success": True,
"processes_found": 0,
"processes_killed": 0,
"message": "No VLC processes found",
}
mock_result = create_mock_vlc_stop_result(
success=True,
processes_found=0,
processes_killed=0,
message="No VLC processes found"
)
mock_vlc_service.stop_all_vlc_instances.return_value = mock_result
# Override dependency
test_app.dependency_overrides[get_vlc_player] = lambda: mock_vlc_service
# Use dependency override helper
overrides = {get_vlc_player: lambda: mock_vlc_service}
try:
async with override_dependencies(test_app, overrides):
response = await authenticated_client.post("/api/v1/sounds/vlc/stop-all")
assert response.status_code == 200
@@ -260,9 +252,6 @@ class TestVLCEndpoints:
assert data["processes_found"] == 0
assert data["processes_killed"] == 0
assert data["message"] == "No VLC processes found"
finally:
# Clean up dependency override
test_app.dependency_overrides.pop(get_vlc_player, None)
@pytest.mark.asyncio
async def test_stop_all_vlc_instances_partial_success(