diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 628b31d..0000000 --- a/pytest.ini +++ /dev/null @@ -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 \ No newline at end of file diff --git a/tests/agents/test_market.py b/tests/agents/test_market.py index e34a297..20a803f 100644 --- a/tests/agents/test_market.py +++ b/tests/agents/test_market.py @@ -1,6 +1,9 @@ import os import pytest +from app.agents.market import MarketToolkit 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 class TestMarketSystem: @@ -20,68 +23,38 @@ class TestMarketSystem: def test_providers_configuration(self): available_providers = [] - - # Controlla Coinbase if os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY'): available_providers.append('coinbase') - - # Controlla CryptoCompare if os.getenv('CRYPTOCOMPARE_API_KEY'): available_providers.append('cryptocompare') - assert len(available_providers) > 0 - print(f"Available providers: {available_providers}") def test_wrapper_capabilities(self, market_wrapper): - wrapper_type = type(market_wrapper).__name__ capabilities = [] - if hasattr(market_wrapper, 'get_product'): capabilities.append('single_product') if hasattr(market_wrapper, 'get_products'): capabilities.append('multiple_products') if hasattr(market_wrapper, 'get_historical_prices'): capabilities.append('historical_data') - assert len(capabilities) > 0 - print(f"{wrapper_type} capabilities: {capabilities}") def test_market_data_retrieval(self, market_wrapper): - try: - btc_product = market_wrapper.get_product("BTC") - assert btc_product is not None - assert hasattr(btc_product, 'symbol') - assert hasattr(btc_product, 'price') - 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 + btc_product = market_wrapper.get_product("BTC") + assert btc_product is not None + assert hasattr(btc_product, 'symbol') + assert hasattr(btc_product, 'price') + assert btc_product.price > 0 def test_market_toolkit_integration(self, market_wrapper): try: - from app.agents.market import MarketToolkit - - # Inizializza il toolkit toolkit = MarketToolkit() assert toolkit is not None assert hasattr(toolkit, 'market_agent') assert toolkit.market_agent is not None - # Testa che il toolkit possa essere utilizzato tools = toolkit.tools assert len(tools) > 0 - print(f"MarketToolkit initialized with {len(tools)} tools") except Exception as e: print(f"MarketToolkit test failed: {e}") @@ -93,19 +66,14 @@ class TestMarketSystem: ) def test_cryptocompare_wrapper(self): try: - from app.markets.cryptocompare import CryptoCompareWrapper - api_key = os.getenv('CRYPTOCOMPARE_API_KEY') wrapper = CryptoCompareWrapper(api_key=api_key, currency="USD") - # Test get_product btc_product = wrapper.get_product("BTC") assert btc_product is not None assert btc_product.symbol == "BTC" assert btc_product.price > 0 - print(f"BTC Price (CryptoCompare): ${btc_product.price}") - # Test get_products products = wrapper.get_products(["BTC", "ETH"]) assert isinstance(products, list) assert len(products) > 0 @@ -113,7 +81,6 @@ class TestMarketSystem: for product in products: if product.symbol in ["BTC", "ETH"]: assert product.price > 0 - print(f"{product.symbol} Price: ${product.price}") except Exception as e: print(f"CryptoCompare test failed: {e}") @@ -125,31 +92,22 @@ class TestMarketSystem: ) def test_coinbase_wrapper(self): try: - from app.markets.coinbase import CoinBaseWrapper - api_key = os.getenv('CDP_API_KEY_NAME') api_secret = os.getenv('CDP_API_PRIVATE_KEY') - if not (api_key and api_secret): - pytest.skip("Coinbase credentials not properly configured") - wrapper = CoinBaseWrapper( api_key=api_key, api_private_key=api_secret, currency="USD" ) - # Test get_product btc_product = wrapper.get_product("BTC") assert btc_product is not None assert btc_product.symbol == "BTC" assert btc_product.price > 0 - print(f"BTC Price (Coinbase): ${btc_product.price}") - # Test get_products products = wrapper.get_products(["BTC", "ETH"]) assert isinstance(products, list) assert len(products) > 0 - print(f"Retrieved {len(products)} products from Coinbase") except Exception as e: print(f"Coinbase test failed: {e}") @@ -157,46 +115,33 @@ class TestMarketSystem: def test_provider_selection_mechanism(self): potential_providers = 0 - if (os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY')) or \ - (os.getenv('COINBASE_API_KEY') and os.getenv('COINBASE_API_SECRET')): + if os.getenv('CDP_API_KEY_NAME') and os.getenv('CDP_API_PRIVATE_KEY'): potential_providers += 1 - if os.getenv('CRYPTOCOMPARE_API_KEY'): potential_providers += 1 if potential_providers == 0: - # Testa che sollevi AssertionError quando non ci sono provider with pytest.raises(AssertionError, match="No valid API keys"): get_first_available_market_api() else: - # Testa che restituisca un wrapper valido wrapper = get_first_available_market_api("USD") assert wrapper is not None assert hasattr(wrapper, 'get_product') - wrapper_type = type(wrapper).__name__ - print(f"Selected wrapper: {wrapper_type}") def test_error_handling(self, market_wrapper): try: fake_product = market_wrapper.get_product("NONEXISTENT_CRYPTO_SYMBOL_12345") - # Se non solleva un errore, verifica che gestisca gracefully - if fake_product is not None: - print("Wrapper returned data for non-existent symbol (API may have fallback)") + assert fake_product is None or fake_product.price == 0 except Exception as e: - # È normale che sollevi un'eccezione per simboli inesistenti - print(f"Wrapper correctly handled non-existent symbol: {type(e).__name__}") + pass - # Test con lista vuota try: empty_products = market_wrapper.get_products([]) assert isinstance(empty_products, list) - print("Wrapper handled empty symbol list correctly") except Exception as e: - print(f"Wrapper handled empty list with exception: {type(e).__name__}") + pass def test_wrapper_currency_support(self, market_wrapper): assert hasattr(market_wrapper, 'currency') - print(f"Wrapper configured for currency: {market_wrapper.currency}") - assert isinstance(market_wrapper.currency, str) assert len(market_wrapper.currency) >= 3 # USD, EUR, etc. diff --git a/tests/conftest.py b/tests/conftest.py index c5309be..d926996 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,9 +2,8 @@ Configurazione pytest per i test del progetto upo-appAI. """ -import pytest -import os import sys +import pytest from pathlib import Path # 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 if "overview" in item.name.lower() or "analysis" in item.name.lower(): 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')), - } \ No newline at end of file