|
8 | 8 | import market_signal_runtime |
9 | 9 |
|
10 | 10 |
|
11 | | -def test_non_ibit_profile_does_not_load_market_signal(): |
| 11 | +def test_unsupported_profile_does_not_load_market_signal(): |
12 | 12 | settings = SimpleNamespace(market_signal_required=True) |
13 | 13 |
|
14 | 14 | assert ( |
15 | 15 | market_signal_runtime.resolve_external_market_signal_inputs( |
16 | | - strategy_profile="soxl_soxx_trend_income", |
| 16 | + strategy_profile="tqqq_growth_income", |
17 | 17 | available_inputs={"derived_indicators"}, |
18 | 18 | runtime_settings=settings, |
19 | 19 | ) |
@@ -42,6 +42,30 @@ def test_ibit_required_reference_missing_raises(): |
42 | 42 | ) |
43 | 43 |
|
44 | 44 |
|
| 45 | +def test_soxl_without_reference_preserves_legacy_inputs(): |
| 46 | + settings = SimpleNamespace(market_signal_required=False) |
| 47 | + |
| 48 | + assert market_signal_runtime.resolve_external_market_signal_inputs( |
| 49 | + strategy_profile="soxl_soxx_trend_income", |
| 50 | + available_inputs={"derived_indicators"}, |
| 51 | + runtime_settings=settings, |
| 52 | + ) == {} |
| 53 | + |
| 54 | + |
| 55 | +def test_soxl_required_reference_missing_raises(): |
| 56 | + settings = SimpleNamespace(market_signal_required=True) |
| 57 | + |
| 58 | + with pytest.raises( |
| 59 | + RuntimeError, |
| 60 | + match="soxl_soxx_trend_income external market signal is required", |
| 61 | + ): |
| 62 | + market_signal_runtime.resolve_external_market_signal_inputs( |
| 63 | + strategy_profile="soxl_soxx_trend_income", |
| 64 | + available_inputs={"derived_indicators"}, |
| 65 | + runtime_settings=settings, |
| 66 | + ) |
| 67 | + |
| 68 | + |
45 | 69 | def test_ibit_handoff_index_reference_is_extracted(monkeypatch, tmp_path): |
46 | 70 | calls: dict[str, object] = {} |
47 | 71 |
|
@@ -103,3 +127,70 @@ def fake_extract( |
103 | 127 | "last_valid", |
104 | 128 | 5, |
105 | 129 | ) |
| 130 | + |
| 131 | + |
| 132 | +def test_soxl_handoff_index_reference_is_extracted(monkeypatch, tmp_path): |
| 133 | + calls: dict[str, object] = {} |
| 134 | + |
| 135 | + def fake_extract( |
| 136 | + reference, |
| 137 | + *, |
| 138 | + reference_type, |
| 139 | + consumer, |
| 140 | + cache_dir, |
| 141 | + as_of, |
| 142 | + client_factory=None, |
| 143 | + fallback_mode=None, |
| 144 | + fallback_max_stale_days=None, |
| 145 | + ): |
| 146 | + calls["extract"] = ( |
| 147 | + reference, |
| 148 | + reference_type, |
| 149 | + consumer, |
| 150 | + cache_dir, |
| 151 | + as_of, |
| 152 | + client_factory, |
| 153 | + fallback_mode, |
| 154 | + fallback_max_stale_days, |
| 155 | + ) |
| 156 | + return { |
| 157 | + "derived_indicators": { |
| 158 | + "SOXL": {"price": 25.0, "ma_trend": 24.0}, |
| 159 | + "SOXX": {"price": 400.0, "ma_trend": 390.0}, |
| 160 | + } |
| 161 | + }, { |
| 162 | + "reference_type": reference_type, |
| 163 | + "source_uri": reference, |
| 164 | + "materialized_count": 2, |
| 165 | + } |
| 166 | + |
| 167 | + monkeypatch.setattr( |
| 168 | + market_signal_runtime, |
| 169 | + "extract_consumer_market_signal_inputs_from_reference", |
| 170 | + fake_extract, |
| 171 | + ) |
| 172 | + settings = SimpleNamespace( |
| 173 | + market_signal_handoff_index_uri="gs://signals/platform_handoffs/index.json", |
| 174 | + market_signal_cache_dir=str(tmp_path), |
| 175 | + market_signal_required=True, |
| 176 | + market_signal_fallback_mode="none", |
| 177 | + ) |
| 178 | + |
| 179 | + assert market_signal_runtime.resolve_external_market_signal_inputs( |
| 180 | + strategy_profile="soxl_soxx_trend_income", |
| 181 | + available_inputs={"derived_indicators"}, |
| 182 | + runtime_settings=settings, |
| 183 | + as_of=datetime(2026, 6, 19, tzinfo=timezone.utc), |
| 184 | + logger=lambda _message: None, |
| 185 | + client_factory=object, |
| 186 | + )["derived_indicators"]["SOXL"]["price"] == 25.0 |
| 187 | + assert calls["extract"] == ( |
| 188 | + "gs://signals/platform_handoffs/index.json", |
| 189 | + "platform_handoff_index", |
| 190 | + "us_equity:soxl_soxx_trend_income", |
| 191 | + tmp_path, |
| 192 | + "2026-06-19", |
| 193 | + object, |
| 194 | + "none", |
| 195 | + 3, |
| 196 | + ) |
0 commit comments