""" tests/conftest.py — Shared fixtures for pytest. """ from __future__ import annotations import datetime import os import sys from pathlib import Path import numpy as np import pandas as pd import pytest # Ensure project root on path ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT)) # Force DRY_RUN for all tests os.environ.setdefault("DRY_RUN", "true") os.environ.setdefault("TRADING_MODE", "paper") os.environ.setdefault("ALPACA_API_KEY", "test_key") os.environ.setdefault("ALPACA_SECRET_KEY", "test_secret") os.environ.setdefault("ALPACA_BASE_URL", "https://paper-api.alpaca.markets") os.environ.setdefault("TELEGRAM_BOT_TOKEN", "000:TEST") os.environ.setdefault("TELEGRAM_CHAT_ID", "0") os.environ.setdefault("NEWS_API_KEY", "testkey") os.environ.setdefault("UNIVERSE", "AAPL,MSFT,NVDA") os.environ.setdefault("ENV_SCHEMA_VERSION", "2") os.environ.setdefault("GPU_AVAILABLE", "false") os.environ.setdefault("ALLOW_SHORT", "true") os.environ.setdefault("ACCOUNT_BALANCE_ABOVE_25K", "true") os.environ.setdefault("ALPACA_ACCOUNT_TYPE", "margin") os.environ.setdefault("ALLOW_OVERNIGHT_POSITIONS", "false") os.environ.setdefault("DB_BACKEND", "sqlite") @pytest.fixture def sample_5m_bars(): """Generate 200 rows of realistic 5-minute bar data.""" np.random.seed(42) n = 200 base = 150.0 timestamps = pd.date_range( start="2024-06-01 09:30", periods=n, freq="5min", tz="US/Eastern", ) close = base + np.cumsum(np.random.randn(n) * 0.3) high = close + np.abs(np.random.randn(n) * 0.2) low = close - np.abs(np.random.randn(n) * 0.2) open_ = close + np.random.randn(n) * 0.1 volume = np.random.randint(10000, 100000, n).astype(float) vwap = (high + low + close) / 3.0 trade_count = np.random.randint(50, 500, n).astype(float) df = pd.DataFrame({ "timestamp": timestamps, "open": open_, "high": high, "low": low, "close": close, "volume": volume, "vwap": vwap, "trade_count": trade_count, }) return df @pytest.fixture def sample_1h_bars(): """Generate 100 rows of hourly bar data.""" np.random.seed(99) n = 100 base = 150.0 timestamps = pd.date_range( start="2024-05-01 09:30", periods=n, freq="1h", tz="US/Eastern", ) close = base + np.cumsum(np.random.randn(n) * 0.5) high = close + np.abs(np.random.randn(n) * 0.3) low = close - np.abs(np.random.randn(n) * 0.3) open_ = close + np.random.randn(n) * 0.15 volume = np.random.randint(50000, 500000, n).astype(float) vwap = (high + low + close) / 3.0 trade_count = np.random.randint(200, 2000, n).astype(float) df = pd.DataFrame({ "timestamp": timestamps, "open": open_, "high": high, "low": low, "close": close, "volume": volume, "vwap": vwap, "trade_count": trade_count, }) return df @pytest.fixture def sample_1d_bars(): """Generate 252 rows of daily bar data (1 year).""" np.random.seed(7) n = 252 base = 150.0 timestamps = pd.bdate_range( start="2024-01-01", periods=n, ) timestamps = timestamps.tz_localize("US/Eastern") close = base + np.cumsum(np.random.randn(n) * 1.5) high = close + np.abs(np.random.randn(n) * 1.0) low = close - np.abs(np.random.randn(n) * 1.0) open_ = close + np.random.randn(n) * 0.5 volume = np.random.randint(1_000_000, 10_000_000, n).astype(float) vwap = (high + low + close) / 3.0 trade_count = np.random.randint(1000, 10000, n).astype(float) df = pd.DataFrame({ "timestamp": timestamps, "open": open_, "high": high, "low": low, "close": close, "volume": volume, "vwap": vwap, "trade_count": trade_count, }) return df