Remove pytest configuration file and clean up test suite by optimizing imports and simplifying test methods
This commit is contained in:
34
pytest.ini
34
pytest.ini
@@ -1,34 +0,0 @@
|
|||||||
[tool:pytest]
|
|
||||||
# Configurazione pytest per upo-appAI
|
|
||||||
|
|
||||||
# Directory dei test
|
|
||||||
testpaths = tests
|
|
||||||
|
|
||||||
# Pattern per trovare i file di test
|
|
||||||
python_files = test_*.py *_test.py
|
|
||||||
|
|
||||||
# Pattern per trovare le classi di test
|
|
||||||
python_classes = Test*
|
|
||||||
|
|
||||||
# Pattern per trovare le funzioni di test
|
|
||||||
python_functions = test_*
|
|
||||||
|
|
||||||
# Opzioni di default
|
|
||||||
addopts =
|
|
||||||
-v
|
|
||||||
--tb=short
|
|
||||||
--strict-markers
|
|
||||||
--disable-warnings
|
|
||||||
|
|
||||||
# Marker personalizzati
|
|
||||||
markers =
|
|
||||||
slow: marks tests as slow (deselect with '-m "not slow"')
|
|
||||||
api: marks tests that require API access
|
|
||||||
coinbase: marks tests that require Coinbase credentials
|
|
||||||
cryptocompare: marks tests that require CryptoCompare credentials
|
|
||||||
integration: marks tests as integration tests
|
|
||||||
|
|
||||||
# Filtri per warnings
|
|
||||||
filterwarnings =
|
|
||||||
ignore::DeprecationWarning
|
|
||||||
ignore::PendingDeprecationWarning
|
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import pytest
|
import pytest
|
||||||
|
from app.agents.market import MarketToolkit
|
||||||
from app.markets.base import BaseWrapper
|
from app.markets.base import BaseWrapper
|
||||||
|
from app.markets.coinbase import CoinBaseWrapper
|
||||||
|
from app.markets.cryptocompare import CryptoCompareWrapper
|
||||||
from app.markets import get_first_available_market_api
|
from app.markets import get_first_available_market_api
|
||||||
|
|
||||||
class TestMarketSystem:
|
class TestMarketSystem:
|
||||||
@@ -20,68 +23,38 @@ class TestMarketSystem:
|
|||||||
|
|
||||||
def test_providers_configuration(self):
|
def test_providers_configuration(self):
|
||||||
available_providers = []
|
available_providers = []
|
||||||
|
|
||||||
# Controlla Coinbase
|
|
||||||
if os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY'):
|
if os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY'):
|
||||||
available_providers.append('coinbase')
|
available_providers.append('coinbase')
|
||||||
|
|
||||||
# Controlla CryptoCompare
|
|
||||||
if os.getenv('CRYPTOCOMPARE_API_KEY'):
|
if os.getenv('CRYPTOCOMPARE_API_KEY'):
|
||||||
available_providers.append('cryptocompare')
|
available_providers.append('cryptocompare')
|
||||||
|
|
||||||
assert len(available_providers) > 0
|
assert len(available_providers) > 0
|
||||||
print(f"Available providers: {available_providers}")
|
|
||||||
|
|
||||||
def test_wrapper_capabilities(self, market_wrapper):
|
def test_wrapper_capabilities(self, market_wrapper):
|
||||||
wrapper_type = type(market_wrapper).__name__
|
|
||||||
capabilities = []
|
capabilities = []
|
||||||
|
|
||||||
if hasattr(market_wrapper, 'get_product'):
|
if hasattr(market_wrapper, 'get_product'):
|
||||||
capabilities.append('single_product')
|
capabilities.append('single_product')
|
||||||
if hasattr(market_wrapper, 'get_products'):
|
if hasattr(market_wrapper, 'get_products'):
|
||||||
capabilities.append('multiple_products')
|
capabilities.append('multiple_products')
|
||||||
if hasattr(market_wrapper, 'get_historical_prices'):
|
if hasattr(market_wrapper, 'get_historical_prices'):
|
||||||
capabilities.append('historical_data')
|
capabilities.append('historical_data')
|
||||||
|
|
||||||
assert len(capabilities) > 0
|
assert len(capabilities) > 0
|
||||||
print(f"{wrapper_type} capabilities: {capabilities}")
|
|
||||||
|
|
||||||
def test_market_data_retrieval(self, market_wrapper):
|
def test_market_data_retrieval(self, market_wrapper):
|
||||||
try:
|
btc_product = market_wrapper.get_product("BTC")
|
||||||
btc_product = market_wrapper.get_product("BTC")
|
assert btc_product is not None
|
||||||
assert btc_product is not None
|
assert hasattr(btc_product, 'symbol')
|
||||||
assert hasattr(btc_product, 'symbol')
|
assert hasattr(btc_product, 'price')
|
||||||
assert hasattr(btc_product, 'price')
|
assert btc_product.price > 0
|
||||||
assert btc_product.price > 0
|
|
||||||
print(f"BTC data retrieved: {btc_product.symbol} - ${btc_product.price}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
# Se il singolo prodotto fallisce, testa con products multipli
|
|
||||||
try:
|
|
||||||
products = market_wrapper.get_products(["BTC"])
|
|
||||||
assert isinstance(products, list)
|
|
||||||
assert len(products) > 0
|
|
||||||
btc_product = products[0]
|
|
||||||
assert btc_product.price > 0
|
|
||||||
print(f"BTC data retrieved via products: {btc_product.symbol} - ${btc_product.price}")
|
|
||||||
except Exception as e2:
|
|
||||||
print(f"Both single and multiple product calls failed: {e}, {e2}")
|
|
||||||
# Non fail il test se entrambi falliscono - potrebbe essere un problema di API keys
|
|
||||||
|
|
||||||
def test_market_toolkit_integration(self, market_wrapper):
|
def test_market_toolkit_integration(self, market_wrapper):
|
||||||
try:
|
try:
|
||||||
from app.agents.market import MarketToolkit
|
|
||||||
|
|
||||||
# Inizializza il toolkit
|
|
||||||
toolkit = MarketToolkit()
|
toolkit = MarketToolkit()
|
||||||
assert toolkit is not None
|
assert toolkit is not None
|
||||||
assert hasattr(toolkit, 'market_agent')
|
assert hasattr(toolkit, 'market_agent')
|
||||||
assert toolkit.market_agent is not None
|
assert toolkit.market_agent is not None
|
||||||
|
|
||||||
# Testa che il toolkit possa essere utilizzato
|
|
||||||
tools = toolkit.tools
|
tools = toolkit.tools
|
||||||
assert len(tools) > 0
|
assert len(tools) > 0
|
||||||
print(f"MarketToolkit initialized with {len(tools)} tools")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"MarketToolkit test failed: {e}")
|
print(f"MarketToolkit test failed: {e}")
|
||||||
@@ -93,19 +66,14 @@ class TestMarketSystem:
|
|||||||
)
|
)
|
||||||
def test_cryptocompare_wrapper(self):
|
def test_cryptocompare_wrapper(self):
|
||||||
try:
|
try:
|
||||||
from app.markets.cryptocompare import CryptoCompareWrapper
|
|
||||||
|
|
||||||
api_key = os.getenv('CRYPTOCOMPARE_API_KEY')
|
api_key = os.getenv('CRYPTOCOMPARE_API_KEY')
|
||||||
wrapper = CryptoCompareWrapper(api_key=api_key, currency="USD")
|
wrapper = CryptoCompareWrapper(api_key=api_key, currency="USD")
|
||||||
|
|
||||||
# Test get_product
|
|
||||||
btc_product = wrapper.get_product("BTC")
|
btc_product = wrapper.get_product("BTC")
|
||||||
assert btc_product is not None
|
assert btc_product is not None
|
||||||
assert btc_product.symbol == "BTC"
|
assert btc_product.symbol == "BTC"
|
||||||
assert btc_product.price > 0
|
assert btc_product.price > 0
|
||||||
print(f"BTC Price (CryptoCompare): ${btc_product.price}")
|
|
||||||
|
|
||||||
# Test get_products
|
|
||||||
products = wrapper.get_products(["BTC", "ETH"])
|
products = wrapper.get_products(["BTC", "ETH"])
|
||||||
assert isinstance(products, list)
|
assert isinstance(products, list)
|
||||||
assert len(products) > 0
|
assert len(products) > 0
|
||||||
@@ -113,7 +81,6 @@ class TestMarketSystem:
|
|||||||
for product in products:
|
for product in products:
|
||||||
if product.symbol in ["BTC", "ETH"]:
|
if product.symbol in ["BTC", "ETH"]:
|
||||||
assert product.price > 0
|
assert product.price > 0
|
||||||
print(f"{product.symbol} Price: ${product.price}")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"CryptoCompare test failed: {e}")
|
print(f"CryptoCompare test failed: {e}")
|
||||||
@@ -125,31 +92,22 @@ class TestMarketSystem:
|
|||||||
)
|
)
|
||||||
def test_coinbase_wrapper(self):
|
def test_coinbase_wrapper(self):
|
||||||
try:
|
try:
|
||||||
from app.markets.coinbase import CoinBaseWrapper
|
|
||||||
|
|
||||||
api_key = os.getenv('CDP_API_KEY_NAME')
|
api_key = os.getenv('CDP_API_KEY_NAME')
|
||||||
api_secret = os.getenv('CDP_API_PRIVATE_KEY')
|
api_secret = os.getenv('CDP_API_PRIVATE_KEY')
|
||||||
if not (api_key and api_secret):
|
|
||||||
pytest.skip("Coinbase credentials not properly configured")
|
|
||||||
|
|
||||||
wrapper = CoinBaseWrapper(
|
wrapper = CoinBaseWrapper(
|
||||||
api_key=api_key,
|
api_key=api_key,
|
||||||
api_private_key=api_secret,
|
api_private_key=api_secret,
|
||||||
currency="USD"
|
currency="USD"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test get_product
|
|
||||||
btc_product = wrapper.get_product("BTC")
|
btc_product = wrapper.get_product("BTC")
|
||||||
assert btc_product is not None
|
assert btc_product is not None
|
||||||
assert btc_product.symbol == "BTC"
|
assert btc_product.symbol == "BTC"
|
||||||
assert btc_product.price > 0
|
assert btc_product.price > 0
|
||||||
print(f"BTC Price (Coinbase): ${btc_product.price}")
|
|
||||||
|
|
||||||
# Test get_products
|
|
||||||
products = wrapper.get_products(["BTC", "ETH"])
|
products = wrapper.get_products(["BTC", "ETH"])
|
||||||
assert isinstance(products, list)
|
assert isinstance(products, list)
|
||||||
assert len(products) > 0
|
assert len(products) > 0
|
||||||
print(f"Retrieved {len(products)} products from Coinbase")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Coinbase test failed: {e}")
|
print(f"Coinbase test failed: {e}")
|
||||||
@@ -157,46 +115,33 @@ class TestMarketSystem:
|
|||||||
|
|
||||||
def test_provider_selection_mechanism(self):
|
def test_provider_selection_mechanism(self):
|
||||||
potential_providers = 0
|
potential_providers = 0
|
||||||
if (os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY')) or \
|
if os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY'):
|
||||||
(os.getenv('COINBASE_API_KEY') and os.getenv('COINBASE_API_SECRET')):
|
|
||||||
potential_providers += 1
|
potential_providers += 1
|
||||||
|
|
||||||
if os.getenv('CRYPTOCOMPARE_API_KEY'):
|
if os.getenv('CRYPTOCOMPARE_API_KEY'):
|
||||||
potential_providers += 1
|
potential_providers += 1
|
||||||
|
|
||||||
if potential_providers == 0:
|
if potential_providers == 0:
|
||||||
# Testa che sollevi AssertionError quando non ci sono provider
|
|
||||||
with pytest.raises(AssertionError, match="No valid API keys"):
|
with pytest.raises(AssertionError, match="No valid API keys"):
|
||||||
get_first_available_market_api()
|
get_first_available_market_api()
|
||||||
else:
|
else:
|
||||||
# Testa che restituisca un wrapper valido
|
|
||||||
wrapper = get_first_available_market_api("USD")
|
wrapper = get_first_available_market_api("USD")
|
||||||
assert wrapper is not None
|
assert wrapper is not None
|
||||||
assert hasattr(wrapper, 'get_product')
|
assert hasattr(wrapper, 'get_product')
|
||||||
wrapper_type = type(wrapper).__name__
|
|
||||||
print(f"Selected wrapper: {wrapper_type}")
|
|
||||||
|
|
||||||
def test_error_handling(self, market_wrapper):
|
def test_error_handling(self, market_wrapper):
|
||||||
try:
|
try:
|
||||||
fake_product = market_wrapper.get_product("NONEXISTENT_CRYPTO_SYMBOL_12345")
|
fake_product = market_wrapper.get_product("NONEXISTENT_CRYPTO_SYMBOL_12345")
|
||||||
# Se non solleva un errore, verifica che gestisca gracefully
|
assert fake_product is None or fake_product.price == 0
|
||||||
if fake_product is not None:
|
|
||||||
print("Wrapper returned data for non-existent symbol (API may have fallback)")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# È normale che sollevi un'eccezione per simboli inesistenti
|
pass
|
||||||
print(f"Wrapper correctly handled non-existent symbol: {type(e).__name__}")
|
|
||||||
|
|
||||||
# Test con lista vuota
|
|
||||||
try:
|
try:
|
||||||
empty_products = market_wrapper.get_products([])
|
empty_products = market_wrapper.get_products([])
|
||||||
assert isinstance(empty_products, list)
|
assert isinstance(empty_products, list)
|
||||||
print("Wrapper handled empty symbol list correctly")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Wrapper handled empty list with exception: {type(e).__name__}")
|
pass
|
||||||
|
|
||||||
def test_wrapper_currency_support(self, market_wrapper):
|
def test_wrapper_currency_support(self, market_wrapper):
|
||||||
assert hasattr(market_wrapper, 'currency')
|
assert hasattr(market_wrapper, 'currency')
|
||||||
print(f"Wrapper configured for currency: {market_wrapper.currency}")
|
|
||||||
|
|
||||||
assert isinstance(market_wrapper.currency, str)
|
assert isinstance(market_wrapper.currency, str)
|
||||||
assert len(market_wrapper.currency) >= 3 # USD, EUR, etc.
|
assert len(market_wrapper.currency) >= 3 # USD, EUR, etc.
|
||||||
|
|||||||
@@ -2,9 +2,8 @@
|
|||||||
Configurazione pytest per i test del progetto upo-appAI.
|
Configurazione pytest per i test del progetto upo-appAI.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import pytest
|
|
||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
|
import pytest
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
# Aggiungi il path src al PYTHONPATH per tutti i test
|
# Aggiungi il path src al PYTHONPATH per tutti i test
|
||||||
@@ -43,16 +42,3 @@ def pytest_collection_modifyitems(config, items):
|
|||||||
# Aggiungi marker 'slow' ai test che potrebbero essere lenti
|
# Aggiungi marker 'slow' ai test che potrebbero essere lenti
|
||||||
if "overview" in item.name.lower() or "analysis" in item.name.lower():
|
if "overview" in item.name.lower() or "analysis" in item.name.lower():
|
||||||
item.add_marker(pytest.mark.slow)
|
item.add_marker(pytest.mark.slow)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
|
||||||
def env_vars():
|
|
||||||
"""Fixture per accedere alle variabili d'ambiente nei test"""
|
|
||||||
return {
|
|
||||||
'coinbase_configured': all([
|
|
||||||
os.getenv('COINBASE_API_KEY'),
|
|
||||||
os.getenv('COINBASE_SECRET'),
|
|
||||||
os.getenv('COINBASE_PASSPHRASE')
|
|
||||||
]),
|
|
||||||
'cryptocompare_configured': bool(os.getenv('CRYPTOCOMPARE_API_KEY')),
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user