57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""Tests for Coinbase exchange adapter."""
|
|
|
|
import pytest
|
|
from unittest.mock import Mock, AsyncMock, patch
|
|
from src.exchanges.coinbase import CoinbaseExchange
|
|
|
|
|
|
class TestCoinbaseExchange:
|
|
"""Tests for CoinbaseExchange."""
|
|
|
|
@pytest.fixture
|
|
def exchange(self):
|
|
"""Create Coinbase exchange instance."""
|
|
return CoinbaseExchange(
|
|
name="test_coinbase",
|
|
api_key="test_key",
|
|
secret_key="test_secret",
|
|
permissions="read_only"
|
|
)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_connect(self, exchange):
|
|
"""Test connection to Coinbase."""
|
|
with patch.object(exchange.exchange, 'load_markets', new_callable=AsyncMock):
|
|
await exchange.connect()
|
|
assert exchange.is_connected
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_fetch_balance(self, exchange):
|
|
"""Test fetching balance."""
|
|
mock_balance = {'USD': {'free': 1000.0, 'used': 0.0, 'total': 1000.0}}
|
|
exchange.exchange.fetch_balance = AsyncMock(return_value=mock_balance)
|
|
exchange.is_connected = True
|
|
|
|
balance = await exchange.fetch_balance()
|
|
assert balance == mock_balance
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_place_order_readonly(self, exchange):
|
|
"""Test placing order with read-only permissions."""
|
|
exchange.permissions = "read_only"
|
|
exchange.is_connected = True
|
|
|
|
with pytest.raises(PermissionError):
|
|
await exchange.place_order("BTC/USD", "buy", "market", 0.01)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_fetch_ohlcv(self, exchange):
|
|
"""Test fetching OHLCV data."""
|
|
mock_ohlcv = [[1609459200000, 29000, 29500, 28800, 29300, 1000]]
|
|
exchange.exchange.fetch_ohlcv = AsyncMock(return_value=mock_ohlcv)
|
|
exchange.is_connected = True
|
|
|
|
ohlcv = await exchange.fetch_ohlcv("BTC/USD", "1h")
|
|
assert ohlcv == mock_ohlcv
|
|
|