teste / tests /conftest.py
torxyton's picture
feat: Implementa estrutura completa de testes com pytest
b9c68d4
"""Global pytest configuration and fixtures."""
import os
import sys
import pytest
import tempfile
import shutil
from pathlib import Path
from unittest.mock import Mock, patch
# Add src to Python path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
@pytest.fixture(scope="session")
def project_root():
"""Return the project root directory."""
return Path(__file__).parent.parent
@pytest.fixture(scope="session")
def test_data_dir(project_root):
"""Return the test data directory."""
return project_root / "tests" / "data"
@pytest.fixture
def temp_dir():
"""Create a temporary directory for tests."""
temp_path = tempfile.mkdtemp()
yield Path(temp_path)
shutil.rmtree(temp_path, ignore_errors=True)
@pytest.fixture
def mock_database():
"""Mock database connection."""
with patch('sqlite3.connect') as mock_connect:
mock_db = Mock()
mock_cursor = Mock()
mock_db.cursor.return_value = mock_cursor
mock_connect.return_value = mock_db
yield mock_db, mock_cursor
@pytest.fixture
def sample_market_data():
"""Sample market data for testing."""
return {
'symbol': 'AAPL',
'price': 150.0,
'volume': 1000000,
'timestamp': '2024-01-01T10:00:00Z',
'high': 155.0,
'low': 145.0,
'open': 148.0,
'close': 150.0
}
@pytest.fixture
def mock_gradio_interface():
"""Mock Gradio interface for UI tests."""
with patch('gradio.Interface') as mock_interface:
mock_instance = Mock()
mock_interface.return_value = mock_instance
yield mock_instance
@pytest.fixture
def mock_transformers():
"""Mock transformers library."""
with patch('transformers.pipeline') as mock_pipeline:
mock_model = Mock()
mock_model.return_value = [{'label': 'POSITIVE', 'score': 0.9}]
mock_pipeline.return_value = mock_model
yield mock_model
@pytest.fixture(autouse=True)
def setup_test_environment(monkeypatch):
"""Setup test environment variables."""
monkeypatch.setenv('TESTING', 'true')
monkeypatch.setenv('LOG_LEVEL', 'DEBUG')
monkeypatch.setenv('DATABASE_URL', ':memory:')
@pytest.fixture
def capture_logs(caplog):
"""Capture logs during tests."""
import logging
caplog.set_level(logging.DEBUG)
return caplog
def pytest_configure(config):
"""Configure pytest."""
# Create reports directory if it doesn't exist
reports_dir = Path("reports")
reports_dir.mkdir(exist_ok=True)
# Create test data directory if it doesn't exist
test_data_dir = Path("tests/data")
test_data_dir.mkdir(parents=True, exist_ok=True)
def pytest_collection_modifyitems(config, items):
"""Modify test collection."""
# Add markers based on test file location
for item in items:
if "unit" in str(item.fspath):
item.add_marker(pytest.mark.unit)
elif "integration" in str(item.fspath):
item.add_marker(pytest.mark.integration)
# Mark slow tests
if "slow" in item.name or "performance" in item.name:
item.add_marker(pytest.mark.slow)
def pytest_runtest_setup(item):
"""Setup for each test."""
# Skip slow tests unless explicitly requested
if "slow" in item.keywords and not item.config.getoption("--runslow", default=False):
pytest.skip("need --runslow option to run")
def pytest_addoption(parser):
"""Add custom command line options."""
parser.addoption(
"--runslow", action="store_true", default=False, help="run slow tests"
)
parser.addoption(
"--runintegration", action="store_true", default=False, help="run integration tests"
)