Files
Jyotisha/references/open_source_sources/rishi-ai-mcp/test_rishi_ai_mcp.py
T
732642856 a4f8620a71 v6.2.0: 全面技法宝库升级 — 16个新模块 + 12个文件优化
## 新增模块 (16个)
### P0 精度修复
- ashtakavarga: calc_prastara_av() + calc_sodhita_av()
- kakshya.py: Kakshya评分系统 (8区间×3.75°)
- shadbala.py: Sputa Drishti + Yuddha Bala

### P1 核心升级
- bhava_bala.py: 宫位三元力量 (jyotishganit MIT)
- pancha_mahapurusha.py: PMC完整检测含4层失效条件
- sade_sati.py: Sade Sati+Kantaka Shani
- sudarshana_chakra.py: 三参考点盘+收敛分析
- tajika.py: Sahams 7→36 + Tajika Yogas 10种
- birth_time_rectifier.py: 生时矫正

### P2 覆盖扩展
- kp_system.py: KP Sublord+ABCD Significator (diliprk/VedicAstro MIT)
- synastry.py: 16因子合盘36分制 (dashaflow MIT)
- muhurtha_election.py: 6活动选举 (dashaflow MIT)
- career_analysis.py: 结构化事业引擎
- relationship_analysis.py: 结构化感情引擎
- conditional_dashas.py: Dwisaptati+Shattrimsa+Dwadashottari
- divisional_charts_extended: D81/D108/D144
- remedies.py: 5类补救系统

## 修改文件
jaimini/dasha_calculator/shadbala/SKILL.md/COVERAGE_AUDIT等12个

## 开源复用: 4个MIT项目
2026-06-11 19:03:21 +08:00

191 lines
7.2 KiB
Python

"""
Test Suite for RishiAI MCP Server
==================================
Tests the thin MCP wrapper that delegates to the DashaFlow library.
Validates that each MCP tool function returns valid JSON with expected structure.
"""
import unittest
import json
from rishi_ai_mcp import (
cast_vedic_chart,
cast_transit_chart,
calculate_compatibility_tool,
check_muhurtha_tool,
analyze_career_chart,
)
class TestCastVedicChart(unittest.TestCase):
"""Test the cast_vedic_chart MCP tool."""
def test_returns_valid_json(self):
result = cast_vedic_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertNotIn("error", data)
def test_has_all_top_level_keys(self):
result = cast_vedic_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
for key in ["metadata", "panchang", "lagna", "planets", "dashas", "yogas",
"ashtakavarga", "jaimini_karakas", "shadbala",
"bhava_chalit", "avasthas", "kaal_sarpa", "graha_yuddha",
"gandanta", "arudha_padas", "upapada", "karakamsha"]:
self.assertIn(key, data, f"Missing top-level key: {key}")
def test_all_nine_planets(self):
result = cast_vedic_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
for planet in ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]:
self.assertIn(planet, data["planets"])
def test_invalid_date_returns_error(self):
result = cast_vedic_chart("bad-date", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
def test_invalid_timezone_returns_error(self):
result = cast_vedic_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Bogus/Zone")
data = result
self.assertIn("error", data)
def test_invalid_lat_returns_error(self):
result = cast_vedic_chart("1990-04-15", "14:30", 999.0, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
def test_query_date_parameter(self):
result = cast_vedic_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata", "2025-06-15")
data = result
self.assertNotIn("error", data)
self.assertIn("dashas", data)
def test_bvr_chart_lagna_capricorn(self):
result = cast_vedic_chart("1918-10-16", "14:20", 12.9716, 77.5946, "Asia/Kolkata")
data = result
self.assertEqual(data["lagna"]["sign"], "Capricorn")
class TestCastTransitChart(unittest.TestCase):
"""Test the cast_transit_chart MCP tool."""
def test_returns_valid_json(self):
result = cast_transit_chart("2025-06-15", "1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertNotIn("error", data)
def test_has_planets_and_sade_sati(self):
result = cast_transit_chart("2025-06-15", "1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("planets", data)
self.assertIn("sade_sati", data)
self.assertIn("rahu_ketu_axis", data)
def test_transit_planet_fields(self):
result = cast_transit_chart("2025-06-15", "1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
for name, pdata in data["planets"].items():
self.assertIn("sign", pdata)
self.assertIn("degree", pdata)
self.assertIn("house_from_lagna", pdata)
def test_invalid_date_returns_error(self):
result = cast_transit_chart("not-a-date", "1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
def test_invalid_dob_returns_error(self):
result = cast_transit_chart("2025-06-15", "not-a-date", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
class TestCalculateCompatibility(unittest.TestCase):
"""Test the calculate_compatibility MCP tool."""
def test_returns_valid_json(self):
result = calculate_compatibility_tool(
"1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata",
"1992-08-20", "10:00", 19.076, 72.8777, "Asia/Kolkata",
)
data = result
self.assertNotIn("error", data)
def test_has_scores_and_total(self):
result = calculate_compatibility_tool(
"1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata",
"1992-08-20", "10:00", 19.076, 72.8777, "Asia/Kolkata",
)
data = result
self.assertIn("total_score", data)
self.assertIn("scores", data)
self.assertIn("kuja_dosha", data)
def test_total_in_range(self):
result = calculate_compatibility_tool(
"1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata",
"1992-08-20", "10:00", 19.076, 72.8777, "Asia/Kolkata",
)
data = result
self.assertGreaterEqual(data["total_score"], 0)
self.assertLessEqual(data["total_score"], 36)
def test_invalid_input_returns_error(self):
result = calculate_compatibility_tool(
"bad", "14:30", 28.6139, 77.2090, "Asia/Kolkata",
"1992-08-20", "10:00", 19.076, 72.8777, "Asia/Kolkata",
)
data = result
self.assertIn("error", data)
class TestCheckMuhurtha(unittest.TestCase):
"""Test the check_muhurtha MCP tool."""
def test_returns_valid_json(self):
result = check_muhurtha_tool("marriage", "2025-06-15", "10:00", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertNotIn("error", data)
def test_has_verdict_and_score(self):
result = check_muhurtha_tool("business", "2025-06-15", "10:00", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("verdict", data)
self.assertIn("score", data)
self.assertIn(data["verdict"], ["auspicious", "mixed_favorable", "mixed", "inauspicious"])
def test_invalid_activity_returns_error(self):
result = check_muhurtha_tool("swimming", "2025-06-15", "10:00", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
def test_invalid_date_returns_error(self):
result = check_muhurtha_tool("travel", "bad-date", "10:00", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
class TestAnalyzeCareerChart(unittest.TestCase):
"""Test the analyze_career_chart MCP tool."""
def test_returns_valid_json(self):
result = analyze_career_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertNotIn("error", data)
def test_has_career_keys(self):
result = analyze_career_chart("1990-04-15", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
for key in ["tenth_house", "d10_indicators", "career_themes", "strength_factors"]:
self.assertIn(key, data)
def test_invalid_input_returns_error(self):
result = analyze_career_chart("bad", "14:30", 28.6139, 77.2090, "Asia/Kolkata")
data = result
self.assertIn("error", data)
if __name__ == "__main__":
unittest.main()