sisi-astrology-api / test_vedic_chart.py
th
feat: 印度占星(Vedic/Jyotish)排盘端点 /api/calculate-vedic-chart
15dfa7b
Raw History Blame Contribute Delete
2.2 kB
"""
印度占星端点测试 — 计算层 + 端点层
跑法: <spike-venv>/bin/python test_vedic_chart.py
固定输入: 1990-01-01 12:00, New Delhi (28.6139, 77.2090), Asia/Kolkata
基准值来自 Task 0 spike 验证 + 与 kerykeion 交叉一致。
"""
import sys, os, io
VEDIC = os.path.join(os.path.dirname(os.path.abspath(__file__)), "vedic")
sys.path.insert(0, VEDIC)
FIXED = dict(year=1990, month=1, day=1, hour=12, minute=0,
lat=28.6139, lon=77.2090, tz_str="Asia/Kolkata")
def _calc():
_real = sys.stdout
sys.stdout = io.StringIO() # 静音 PyJHora noisy import/print
try:
from engine import calculate_full_chart
return calculate_full_chart(**FIXED)
finally:
sys.stdout = _real
def test_lagna_correct():
c = _calc()
assert c["lagna"]["sign"] == "Pisces", c["lagna"]["sign"]
assert c["lagna"]["nakshatra"]["name"] == "Uttara Bhadrapada", c["lagna"]["nakshatra"]
print(" ✓ test_lagna_correct")
def test_all_sections_present():
c = _calc()
for k in ["ayanamsa", "lagna", "planets", "dashas", "shadbala", "d9", "karakas", "aspects"]:
assert k in c, f"missing section: {k}"
for g in ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]:
assert g in c["planets"], f"missing graha: {g}"
print(" ✓ test_all_sections_present")
def test_dasha_has_periods():
c = _calc()
assert c["dashas"], "dashas empty"
print(f" ✓ test_dasha_has_periods ({len(c['dashas'])} periods)")
def test_json_serializable():
"""端点核心: 整盘能用端点的 default lambda 安全序列化成 JSON (numpy/tuple 不炸)"""
import json
c = _calc()
s = json.dumps(c, default=lambda o: float(o) if hasattr(o, "__float__") else str(o))
back = json.loads(s)
assert back["lagna"]["sign"] == "Pisces"
assert "shadbala" in back and "dashas" in back
print(f" ✓ test_json_serializable ({len(s)} bytes)")
if __name__ == "__main__":
print("=== Vedic calc-layer tests ===")
test_lagna_correct()
test_all_sections_present()
test_dasha_has_periods()
test_json_serializable()
print("✅ ALL CALC-LAYER TESTS PASS")