teste / tests /integration /conftest.py
torxyton's picture
feat: Implementa estrutura completa de testes com pytest
b9c68d4
"""Integration tests configuration and fixtures."""
import pytest
import sqlite3
import tempfile
import os
from pathlib import Path
from unittest.mock import patch
@pytest.fixture(scope="session")
def test_database():
"""Create a test database for integration tests."""
# Create temporary database file
db_fd, db_path = tempfile.mkstemp(suffix='.db')
os.close(db_fd)
# Initialize database
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Create tables (simplified schema)
cursor.execute("""
CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
level TEXT NOT NULL,
message TEXT NOT NULL,
module TEXT,
function TEXT,
line_number INTEGER
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS market_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
timestamp TEXT NOT NULL,
price REAL NOT NULL,
volume INTEGER,
high REAL,
low REAL,
open_price REAL,
close_price REAL
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS analysis_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
symbol TEXT NOT NULL,
analysis_type TEXT NOT NULL,
result TEXT NOT NULL,
confidence REAL
)
""")
conn.commit()
conn.close()
yield db_path
# Cleanup
try:
os.unlink(db_path)
except OSError:
pass
@pytest.fixture
def database_connection(test_database):
"""Provide database connection for tests."""
conn = sqlite3.connect(test_database)
conn.row_factory = sqlite3.Row
yield conn
conn.close()
@pytest.fixture
def populated_database(database_connection):
"""Database with sample data."""
cursor = database_connection.cursor()
# Insert sample log data
cursor.execute("""
INSERT INTO logs (timestamp, level, message, module, function, line_number)
VALUES (?, ?, ?, ?, ?, ?)
""", ('2024-01-01 10:00:00', 'INFO', 'Application started', 'app', 'main', 1))
cursor.execute("""
INSERT INTO logs (timestamp, level, message, module, function, line_number)
VALUES (?, ?, ?, ?, ?, ?)
""", ('2024-01-01 10:01:00', 'ERROR', 'Import error occurred', 'market_analysis', 'analyze', 45))
# Insert sample market data
cursor.execute("""
INSERT INTO market_data (symbol, timestamp, price, volume, high, low, open_price, close_price)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", ('AAPL', '2024-01-01 10:00:00', 150.0, 1000000, 155.0, 145.0, 148.0, 150.0))
cursor.execute("""
INSERT INTO market_data (symbol, timestamp, price, volume, high, low, open_price, close_price)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", ('GOOGL', '2024-01-01 10:00:00', 2800.0, 500000, 2850.0, 2750.0, 2780.0, 2800.0))
# Insert sample analysis results
cursor.execute("""
INSERT INTO analysis_results (timestamp, symbol, analysis_type, result, confidence)
VALUES (?, ?, ?, ?, ?)
""", ('2024-01-01 10:00:00', 'AAPL', 'sentiment', 'positive', 0.85))
database_connection.commit()
return database_connection
@pytest.fixture
def mock_external_apis():
"""Mock external API calls for integration tests."""
with patch('yfinance.download') as mock_yf, \
patch('requests.get') as mock_requests:
# Mock yfinance response
import pandas as pd
mock_data = pd.DataFrame({
'Open': [148.0, 150.0, 152.0],
'High': [155.0, 157.0, 159.0],
'Low': [145.0, 147.0, 149.0],
'Close': [150.0, 152.0, 154.0],
'Volume': [1000000, 1100000, 1200000]
})
mock_yf.return_value = mock_data
# Mock requests response
mock_response = type('MockResponse', (), {
'status_code': 200,
'json': lambda: {'data': 'mocked'},
'text': 'mocked response'
})()
mock_requests.return_value = mock_response
yield mock_yf, mock_requests
@pytest.fixture
def integration_config(test_database):
"""Configuration for integration tests."""
return {
'DATABASE_URL': test_database,
'LOG_LEVEL': 'DEBUG',
'CACHE_SIZE': 50,
'API_TIMEOUT': 10,
'TESTING': True
}
@pytest.fixture
def temp_cache_dir():
"""Temporary cache directory for tests."""
import tempfile
import shutil
cache_dir = tempfile.mkdtemp(prefix='test_cache_')
yield Path(cache_dir)
shutil.rmtree(cache_dir, ignore_errors=True)
@pytest.fixture(autouse=True)
def setup_integration_environment(monkeypatch, test_database, temp_cache_dir):
"""Setup environment for integration tests."""
monkeypatch.setenv('DATABASE_URL', test_database)
monkeypatch.setenv('CACHE_DIR', str(temp_cache_dir))
monkeypatch.setenv('TESTING', 'true')
monkeypatch.setenv('LOG_LEVEL', 'DEBUG')