#!/usr/bin/env python3 """BUG-1186 (TASK-upstream-sync4-20261002 T4): the API yoga list is not cut to ten, and an evaluated empty yoga module is not replaced by a chart preview. Both methods read no handler state, so they are called unbound; no ``JyotishAPIHandler`` instance is forged (growth contract). """ from __future__ import annotations import os import sys import types SCRIPTS = os.path.join(os.path.dirname(__file__), '..', 'scripts') if SCRIPTS not in sys.path: sys.path.insert(0, SCRIPTS) from jyotish_api_server import JyotishAPIHandler # noqa: E402 def _install(monkeypatch, name: str, **attrs) -> None: module = types.ModuleType(name) for key, value in attrs.items(): setattr(module, key, value) monkeypatch.setitem(sys.modules, name, module) def test_detect_yogas_returns_all_twelve(monkeypatch) -> None: rows = [{'name': f'Yoga {i}', 'planets': ['Jupiter']} for i in range(12)] _install(monkeypatch, 'pancha_mahapurusha', detect_pancha_mahapurusha=lambda planets: []) _install(monkeypatch, 'yoga_expansion', detect_all_yogas=lambda planets, asc: rows) result = JyotishAPIHandler._detect_yogas(None, {}, 0) # 原值: yogas[:10],第 11、12 条被丢;新值: 12 条全部返回 assert [row['name'] for row in result] == [f'Yoga {i}' for i in range(12)] def _reading(yoga_module, chart_yogas): return { 'chart': {'planets': {'Sun': {}}, 'ascendant': 'Aries', 'yogas': chart_yogas}, 'modules': {'yoga': yoga_module}, } def test_evaluated_empty_module_list_is_not_replaced_by_chart_preview() -> None: preview = [{'name': 'Stale preview yoga'}] normalized = JyotishAPIHandler._chart_from_full_reading(None, _reading({'yogas': []}, preview)) assert normalized['yogas'] == [] def test_module_list_precedes_chart_preview_and_detected_yogas_is_second() -> None: module_rows = [{'name': f'M{i}'} for i in range(12)] preview = [{'name': 'Stale preview yoga'}] normalized = JyotishAPIHandler._chart_from_full_reading(None, _reading({'yogas': module_rows}, preview)) assert normalized['yogas'] == module_rows detected = [{'name': 'Detected'}] normalized = JyotishAPIHandler._chart_from_full_reading(None, _reading({'detected_yogas': detected}, preview)) assert normalized['yogas'] == detected normalized = JyotishAPIHandler._chart_from_full_reading(None, _reading({}, preview)) assert normalized['yogas'] == preview