import pytest import pandas as pd import numpy as np from agents.technical import TechnicalAgent def make_ohlcv(n=100, base_price=100.0): np.random.seed(42) closes = base_price + np.cumsum(np.random.randn(n) * 2) df = pd.DataFrame({ "timestamp": pd.date_range("2026-01-01", periods=n, freq="1h"), "open": closes - np.random.rand(n), "high": closes + np.abs(np.random.randn(n) * 2), "low": closes - np.abs(np.random.randn(n) * 2), "close": closes, "volume": np.random.randint(100, 10000, n).astype(float), "quote_volume": np.random.randint(100000, 1000000, n).astype(float), }) return df def test_score_returns_0_to_100(): agent = TechnicalAgent() df = make_ohlcv(100) score = agent.analyze(df) assert 0 <= score <= 100 def test_score_with_uptrend(): agent = TechnicalAgent() n = 100 closes = np.linspace(100, 200, n) df = pd.DataFrame({ "timestamp": pd.date_range("2026-01-01", periods=n, freq="1h"), "open": closes - 1, "high": closes + 2, "low": closes - 2, "close": closes, "volume": np.full(n, 5000.0), "quote_volume": np.full(n, 500000.0), }) score = agent.analyze(df) assert score >= 55 # uptrend should score above average def test_score_with_downtrend(): agent = TechnicalAgent() n = 100 closes = np.linspace(200, 100, n) df = pd.DataFrame({ "timestamp": pd.date_range("2026-01-01", periods=n, freq="1h"), "open": closes + 1, "high": closes + 2, "low": closes - 2, "close": closes, "volume": np.full(n, 5000.0), "quote_volume": np.full(n, 500000.0), }) score = agent.analyze(df) assert score <= 45 # downtrend should score below average def test_insufficient_data_returns_50(): agent = TechnicalAgent() df = make_ohlcv(5) score = agent.analyze(df) assert score == 50