"""Task 6: merged-engine fields on the commercial consultation path. Fictional smoke data only. No birth-case files. """ from __future__ import annotations from datetime import datetime from scripts.consultation_engine_field_bridge import ( ASHTOTTARI_PARTIAL_NOTE, attach_merged_engine_fields, compact_planetary_friendship, compact_pratyantar_timeline, compact_timing_narrative, extra_technique_audit_rows, ) from scripts.jyotish_engine import _build_planetary_friendship_snapshot SMOKE_PLANETS = { "Sun": {"sign": "Capricorn"}, "Moon": {"sign": "Sagittarius"}, "Mars": {"sign": "Scorpio"}, "Mercury": {"sign": "Capricorn"}, "Jupiter": {"sign": "Gemini"}, "Venus": {"sign": "Aquarius"}, "Saturn": {"sign": "Capricorn"}, "Rahu": {"sign": "Aquarius"}, "Ketu": {"sign": "Leo"}, } def test_friendship_compact_is_grade_table_only() -> None: snapshot = _build_planetary_friendship_snapshot(SMOKE_PLANETS) compact = compact_planetary_friendship(snapshot) assert compact["rows"] first = compact["rows"][0] assert first["planet"] == "Sun" assert set(first) == { "planet", "great_friends", "friends", "neutral", "enemies", "great_enemies", } assert "headline" not in compact assert "markdown" not in compact def test_pratyantar_returns_current_and_next_boundaries() -> None: sub_periods = { "current": { "mahadasha": {"lord": "Rahu", "start": "2011-11-11", "end": "2029-11-11"}, "antardasha": {"lord": "Sun", "start": "2026-05-30", "end": "2027-04-24"}, } } timeline = compact_pratyantar_timeline(sub_periods, datetime(2026, 9, 3)) assert timeline["status"] == "ready" assert timeline["current"]["lord"] assert timeline["current"]["start"] <= "2026-09-03" <= timeline["current"]["end"] assert timeline["next"]["lord"] assert timeline["next"]["start"] == timeline["current"]["end"] def test_timing_narrative_clips_to_seed_caps() -> None: payload = compact_timing_narrative({ "dasha_sub_periods": { "current": {"mahadasha": {"lord": "Rahu"}}, } }) assert payload["status"] != "blocked" assert len(payload["headline"]) <= 300 assert len(payload["strengths"]) <= 8 assert all(len(item) <= 400 for item in payload["strengths"]) assert all(len(item) <= 400 for item in payload["boundaries"]) def test_ashtottari_audit_row_is_parameter_sensitive_not_certainty() -> None: rows = extra_technique_audit_rows({"modules": {}}) by_name = {row["technique"]: row for row in rows} assert by_name["Ashtottari Dasha"]["status"] == "partial" assert by_name["Ashtottari Dasha"]["boundary"] == ASHTOTTARI_PARTIAL_NOTE assert by_name["Planetary Friendship"]["status"] == "blocked" assert by_name["Module Execution Audit"]["boundary"] == "附录可见;不得升格为确定性结论" def test_attach_merged_fields_hangs_friendship_and_pratyantar() -> None: chart = { "planets": SMOKE_PLANETS, "modules": { "dasha_sub_periods": { "current": { "mahadasha": {"lord": "Rahu", "start": "2011-11-11", "end": "2029-11-11"}, "antardasha": {"lord": "Sun", "start": "2026-05-30", "end": "2027-04-24"}, } } }, } attach_merged_engine_fields(chart, reference_dt=datetime(2026, 9, 3)) friendship = chart["modules"]["planetary_friendship"] assert friendship["rows"] pratyantar = chart["modules"]["pratyantar_dasha_timeline"] assert pratyantar["status"] == "ready" nested = chart["modules"]["dasha_sub_periods"]["pratyantar_dasha_timeline"] assert nested["current"]["lord"] == pratyantar["current"]["lord"] audit_rows = extra_technique_audit_rows(chart) friendship_row = next(row for row in audit_rows if row["technique"] == "Planetary Friendship") assert friendship_row["status"] == "executed" assert "确定性" in friendship_row["boundary"]