from datetime import date
import pandas as pd
import pytest
from data.fund_fetcher import _parse_mobile_recent_nav
from services.predictor_service import _fund_nav_fallback_prediction
def test_moneydj_mobile_recent_nav_parser_handles_year_boundary():
html = """
\u7f8e\u5143(2026/01/02)
"""
rows = _parse_mobile_recent_nav(html)
assert rows[0]["date"] == date(2026, 1, 2)
assert rows[0]["close"] == 9.37
assert rows[1]["date"] == date(2025, 12, 31)
assert rows[1]["volume"] == 1.0
def test_short_moneydj_fund_history_returns_degraded_nav_prediction():
df = pd.DataFrame({
"date": pd.date_range("2026-05-01", periods=6),
"open": [9.30, 9.31, 9.32, 9.34, 9.35, 9.37],
"high": [9.30, 9.31, 9.32, 9.34, 9.35, 9.37],
"low": [9.30, 9.31, 9.32, 9.34, 9.35, 9.37],
"close": [9.30, 9.31, 9.32, 9.34, 9.35, 9.37],
"volume": [1.0] * 6,
})
result = _fund_nav_fallback_prediction("PIM91", df)
assert result["signal"] == "HOLD"
assert result["degraded"] is True
assert result["history_rows"] == 6
assert result["feature_version"] == "fund-nav-fallback-v1"
assert result["source"] == "MoneyDJ mobile recent NAV fallback"
assert result["signal_probability"] == pytest.approx(0.5376, abs=0.0001)