3d7b325f73
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
137 lines
3.5 KiB
Python
137 lines
3.5 KiB
Python
"""Pytest configuration and fixtures for Quizzical Beats tests."""
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
import pytest
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
# Add project root to path
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
|
|
def _make_app():
|
|
"""
|
|
Create a Flask application instance suitable for testing.
|
|
|
|
The standard create_app() tries to access /data which may not be writable
|
|
in CI environments. We redirect that path to a temporary directory during
|
|
app creation and then reconfigure SQLAlchemy to use an in-memory database
|
|
for the actual test session.
|
|
"""
|
|
# Set required environment variables before importing the app so that config
|
|
# defaults are populated correctly. Use setdefault so that values provided
|
|
# by the test runner (e.g. SECRET_KEY=test pytest …) are not overridden.
|
|
os.environ.setdefault('SECRET_KEY', 'test-secret-key-for-testing-only')
|
|
os.environ.setdefault('AUTOMATION_TOKEN', 'test-automation-token-for-testing')
|
|
|
|
from musicround import create_app, db
|
|
|
|
tmpdir = tempfile.mkdtemp()
|
|
|
|
_orig_join = os.path.join
|
|
_orig_exists = os.path.exists
|
|
_orig_makedirs = os.makedirs
|
|
|
|
def _join(*args):
|
|
result = _orig_join(*args)
|
|
if result == '/data/song_data.db':
|
|
return os.path.join(tmpdir, 'test.db')
|
|
return result
|
|
|
|
def _exists(path):
|
|
if path == '/data':
|
|
return True
|
|
return _orig_exists(path)
|
|
|
|
def _makedirs(path, **kwargs):
|
|
if path == '/data':
|
|
return
|
|
return _orig_makedirs(path, **kwargs)
|
|
|
|
with patch('os.path.join', side_effect=_join), \
|
|
patch('os.path.exists', side_effect=_exists), \
|
|
patch('os.makedirs', side_effect=_makedirs):
|
|
app = create_app()
|
|
|
|
return app, db
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
"""Create a test Flask application instance."""
|
|
app, db = _make_app()
|
|
|
|
test_config = {
|
|
'TESTING': True,
|
|
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
|
|
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
|
|
'SECRET_KEY': 'test-secret-key-for-testing-only',
|
|
'AUTOMATION_TOKEN': 'test-automation-token-for-testing',
|
|
'WTF_CSRF_ENABLED': False, # Disable CSRF for testing
|
|
}
|
|
app.config.update(test_config)
|
|
|
|
with app.app_context():
|
|
db.create_all()
|
|
yield app
|
|
db.session.remove()
|
|
db.drop_all()
|
|
|
|
|
|
@pytest.fixture
|
|
def client(app):
|
|
"""Create a test client for the app."""
|
|
return app.test_client()
|
|
|
|
|
|
@pytest.fixture
|
|
def runner(app):
|
|
"""Create a test CLI runner."""
|
|
return app.test_cli_runner()
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_app():
|
|
"""Create a mock Flask app for unit testing."""
|
|
app = MagicMock()
|
|
app.logger = MagicMock()
|
|
app.config = {
|
|
'SECRET_KEY': 'test-key',
|
|
'AUTOMATION_TOKEN': 'test-token',
|
|
}
|
|
return app
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_spotify_client():
|
|
"""Create a mock Spotify client."""
|
|
client = MagicMock()
|
|
client.search.return_value = {
|
|
'tracks': {
|
|
'items': []
|
|
}
|
|
}
|
|
return client
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_user_data():
|
|
"""Sample user data for testing."""
|
|
return {
|
|
'username': 'testuser',
|
|
'email': 'test@example.com',
|
|
'password': 'SecurePassword123!',
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_song_data():
|
|
"""Sample song data for testing."""
|
|
return {
|
|
'title': 'Highway to Hell',
|
|
'artist_name': 'AC/DC',
|
|
'year': '1979',
|
|
'genre': 'Hard Rock',
|
|
'isrc': 'AUAP07900028',
|
|
}
|