Remove pytest configuration file and clean up test suite by optimizing imports and simplifying test methods

This commit is contained in:
2025-09-26 05:03:18 +02:00
parent 89c8faf1be
commit d8ed299724
3 changed files with 13 additions and 116 deletions

View File

@@ -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

View File

@@ -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.

View File

@@ -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')),
}