Files
Jyotisha/tests/test_report_density_facts.py
T
jesse-uxandClaude Code f968cb2166
Independent Staging Quality Gate / validate (push) Failing after 17m57s
Independent Staging Quality Gate / publish (push) Skipped
feat(report): add dense personal report appendix
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-23 10:42:17 +08:00

90 lines
4.7 KiB
Python

"""Golden facts use deliberately fictional input, never a user birth record."""
import copy
import json
from pathlib import Path
from scripts.reader_dasha_applicability import BOUNDARY, render_dasha_applicability
from scripts.report_fact_table_contract import validate_fact_tables
ROOT = Path(__file__).resolve().parents[1]
def test_golden_applicability_never_relaxes_missing_or_inapplicable_families():
packet = json.loads((ROOT / "frontend/tests/fixtures/report-density-fictional-reader.json").read_text(encoding="utf8"))
original = copy.deepcopy(packet)
output = render_dasha_applicability(packet)
families = packet["worksheets"]["timing_and_predictive_systems"]["dasha_master_pack"]["families"]
assert len(families) == 15
assert output.count(BOUNDARY) == len(families) - 1 + 2
for key, value in families.items():
if key == "vimshottari":
assert "| Vimshottari |" not in output
continue
name = "Kala Chakra" if key == "kala_chakra" else key.replace("_", "-").title()
assert f"| {name} |" in output
if value.get("reason"):
from scripts.reader_dasha_applicability import REASON_LABELS
assert REASON_LABELS[value["reason"]] in output
assert value["reason"] not in output
assert all(name in output for name in ["Narayana", "Tribhagi-40", "Shattrimshatsama", "Satabdika", "Mudda", "Patyayini"])
assert "月宿与月相组合未满足该大运的适用条件" in output
assert "本地计算尚未提供可用周期" in output
assert packet == original
def test_golden_narayana_periods_and_readable_known_and_unknown_reasons():
packet = json.loads((ROOT / "frontend/tests/fixtures/report-density-fictional-reader.json").read_text(encoding="utf8"))
timing = packet["worksheets"]["timing_and_predictive_systems"]
assert len(timing["narayana_dasha"]["mahadasha_sequence"]) == 12
assert len(timing["narayana_dasha"]["dense_boundaries"]) == 156
output = render_dasha_applicability(packet)
narayana = next(line for line in output.splitlines() if line.startswith("| Narayana |"))
assert "本次已返回周期" in narayana
assert "这不代表已完成多引擎验证" in narayana
assert "缺少可核对周期" not in narayana
assert "本次计算未提供帕特雅伊尼年运周期" in output
assert "patyayini_dasha_missing" not in output
timing["annual_tajika_pack"]["patyayini_dasha"]["reason"] = "unknown_internal_reason_123 arbitrary English detail"
unknown = render_dasha_applicability(packet)
assert "暂无可核对的详细说明" in unknown
assert "unknown_internal_reason_123" not in unknown
assert "arbitrary English detail" not in unknown
def test_legacy_applicability_discloses_missing_evidence_without_guessing_families():
output = render_dasha_applicability({})
assert "缺少本次计算的结构化适用性证据" in output
assert BOUNDARY not in output
def test_full_golden_shared_markdown_is_byte_identical_and_reader_copy_is_clean():
from types import SimpleNamespace
from scripts.professional_report_reference import build_professional_report_reference
from scripts.reader_appendix_language import clean_reader_appendix_markdown
packet = json.loads((ROOT / "frontend/tests/fixtures/report-density-fictional-reader.json").read_text(encoding="utf8"))
raw = packet["markdown"]
engine = SimpleNamespace(build_professional_report_reference_packet=lambda *args: packet, render_pl9_markdown=lambda value: raw)
handler = SimpleNamespace(_high_rigor_birth_payload=lambda body: {"year": 2000, "hour": 12, "minute": 0, "today": "2026-09-22"}, _compute_full_reading_for_thematic=lambda birth: {})
for include in (False, True):
result = build_professional_report_reference(handler, {"format": "markdown", "include_fact_tables": include}, engine=engine)
assert result["markdown"].encode("utf8") == raw.encode("utf8")
if include:
assert result["reader_dasha_applicability"] == packet["reader_dasha_applicability"]
clean = clean_reader_appendix_markdown(raw)
assert "pl9" in raw.lower()
assert "pl9" not in clean.lower()
assert len(clean.splitlines()) == len(raw.splitlines())
assert sum(line.startswith("|") for line in clean.splitlines()) == sum(line.startswith("|") for line in raw.splitlines())
for field in ("degree_in_sign", "sign_cn", "nakshatra_lord"):
assert clean.count(field) == raw.count(field)
def test_optional_table_validator_fails_closed_on_bad_shape():
errors = []
validate_fact_tables([{"id": "annual"}], lambda *error: errors.append(error))
assert errors
errors.clear()
validate_fact_tables([], lambda *error: errors.append(error))
assert not errors