import pandas as pd import pytest from okx_codex_trader import eth_nextgen_micro as module def test_latest_active_engine_uses_shifted_prior_day_regime(monkeypatch): index = pd.date_range("2026-01-01", periods=32, freq="D", tz="UTC") existing = pd.DataFrame({"cost_model": ["maker_taker"], "name": ["equal-2-c0003"], "date": [index[0].strftime("%Y-%m-%d")]}) nextgen = pd.Series([100.0] * 31 + [80.0], index=index) micro = pd.Series([100.0] * 31 + [120.0], index=index) monkeypatch.setattr(module.pd, "read_csv", lambda _: existing) monkeypatch.setattr(module.portfolio, "load_nextgen", lambda _, __: (nextgen, [])) monkeypatch.setattr(module.portfolio, "load_micro_candidates", lambda _, __: {module.MICRO_NAME: (micro, [])}) state = module.latest_active_engine() assert state["active_engine"] == "nextgen" def test_latest_active_engine_switches_on_prior_completed_day(monkeypatch): index = pd.date_range("2026-01-01", periods=33, freq="D", tz="UTC") existing = pd.DataFrame({"cost_model": ["maker_taker"], "name": ["equal-2-c0003"], "date": [index[0].strftime("%Y-%m-%d")]}) nextgen = pd.Series([100.0] * 31 + [80.0, 80.0], index=index) micro = pd.Series([100.0] * 31 + [120.0, 120.0], index=index) monkeypatch.setattr(module.pd, "read_csv", lambda _: existing) monkeypatch.setattr(module.portfolio, "load_nextgen", lambda _, __: (nextgen, [])) monkeypatch.setattr(module.portfolio, "load_micro_candidates", lambda _, __: {module.MICRO_NAME: (micro, [])}) state = module.latest_active_engine() assert state["active_engine"] == "micro" def test_payload_is_readonly(monkeypatch): monkeypatch.setattr(module, "latest_active_engine", lambda: {"active_engine": "nextgen", "decision_date": "2026-01-01"}) monkeypatch.setattr( module.nextgen_intent, "build_payload", lambda: {"decision": {"signal": "no_signal"}, "data": {"decision_candle_ts": 1000}, "legs": []}, ) monkeypatch.setattr(module, "micro_signal", lambda: {"signal": "short"}) payload = module.build_payload() assert payload["submitted_orders"] == 0 assert payload["private_key_required"] is False assert payload["risk_limits"]["no_order_submission"] is True assert payload["risk_limits"]["blocked_for_live_trading"] is True assert payload["decision"]["selected_signal"] == "no_signal" assert payload["execution_intent"]["entry_signal"] == "no_signal" assert payload["execution_intent"]["entry_unit"] == 0.0 assert payload["execution_intent"]["target_position_known"] is False def test_payload_records_nextgen_entry_unit(monkeypatch): monkeypatch.setattr(module, "latest_active_engine", lambda: {"active_engine": "nextgen", "decision_date": "2026-01-01"}) monkeypatch.setattr( module.nextgen_intent, "build_payload", lambda: {"decision": {"signal": "long", "active_suggested_weight": 0.5}, "data": {"decision_candle_ts": 1000}, "legs": []}, ) monkeypatch.setattr(module, "micro_signal", lambda: {"signal": "no_signal"}) payload = module.build_payload() assert payload["decision"]["selected_signal"] == "long" assert payload["execution_intent"]["entry_signal"] == "long" assert payload["execution_intent"]["entry_unit"] == 0.5 assert payload["execution_intent"]["target_position"] is None