fix(domy): przepnij build_chart na cusps_for — inaczej nowe systemy dają 500
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m30s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m28s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 20s
Testy / Kontrola składni wszystkich warstw (push) Successful in 9s

Rozszerzenie houses.SYSTEMS do ośmiu pozycji odblokowało w chart.py filtr
`house_system in H.SYSTEMS`, ale liczenie zostało na H.cusps(), które zna
wyłącznie trzy systemy dzielące ekliptykę i dla pozostałych rzuca ValueError.
Wybranie campanusa przechodziło więc walidację i dopiero potem wywalało 500.

Test parametryzowany po H.SYSTEMS zamyka tę klasę błędu na przyszłość: każdy
system ogłoszony na liście musi przejść przez build_chart, więc dopisanie
nazwy bez przepięcia liczenia od razu zapali się na czerwono.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-05 21:53:54 +02:00
parent 1be57a47d8
commit 548d9301f3
2 changed files with 28 additions and 2 deletions
+4 -2
View File
@@ -97,7 +97,9 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str
asc = H.compute_asc(ramc, eps, moment.lat)
mc = H.compute_mc(ramc, eps)
system = house_system if house_system in H.SYSTEMS else H.WHOLE_SIGN
cusp_list = H.cusps(asc, mc, system) # tropikalne — geometria domów jest niezmiennicza
# cusps_for, nie cusps: to drugie zna tylko trzy systemy dzielące ekliptykę.
# Systemy egzotyczne dzielą inne koła wielkie i potrzebują pełnego (RAMC, ε, φ).
cusp_list = H.cusps_for(ramc, eps, moment.lat, system) # tropikalne — geometria domów jest niezmiennicza
def _cusps_out(cl: list[float]) -> list[dict]:
"""Cuspy → wiersze pod UI/kosmogram: znak, stopień w znaku, długość, glif."""
@@ -132,7 +134,7 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str
if len(ordered) > 1:
result["house_systems"] = []
for s in ordered:
cl = cusp_list if s == system else H.cusps(asc, mc, s)
cl = cusp_list if s == system else H.cusps_for(ramc, eps, moment.lat, s)
result["house_systems"].append({"system": s, "cusps": _cusps_out(cl)})
for pdict, obj in zip(result["positions"], positions):
pdict.setdefault("houses", {})[s] = H.assign_house(obj.longitude, cl)
+24
View File
@@ -2,6 +2,9 @@
Waliduje względem astro.com dla horoskopu referencyjnego.
"""
import pytest
from app.engine import houses as H
from app.engine.chart import build_chart
@@ -66,3 +69,24 @@ def test_unknown_extra_system_is_ignored(own_engine, reference_moment):
chart = build_chart(own_engine, reference_moment, "whole_sign",
house_systems=["placidus", "equal"])
assert [h["system"] for h in chart["house_systems"]] == ["whole_sign", "equal"]
@pytest.mark.parametrize("system", H.SYSTEMS)
def test_every_advertised_system_builds_a_chart(own_engine, reference_moment, system):
"""Każdy system z houses.SYSTEMS musi przejść przez build_chart. Pilnuje,
żeby rozszerzenie SYSTEMS bez przepięcia chart.py nie dało 500 przy wyborze
systemu, który jest na liście, ale nie w użytej funkcji."""
chart = build_chart(own_engine, reference_moment, system)
assert chart["house_system"] == system
assert len(chart["cusps"]) == 12
assert all(1 <= p["house"] <= 12 for p in chart["positions"])
def test_multiple_systems_side_by_side_cover_all(own_engine, reference_moment):
chart = build_chart(own_engine, reference_moment, H.WHOLE_SIGN,
house_systems=list(H.SYSTEMS))
blocks = chart["house_systems"]
assert blocks[0]["system"] == H.WHOLE_SIGN # prymarny zawsze pierwszy
assert {b["system"] for b in blocks} == set(H.SYSTEMS)
for p in chart["positions"]:
assert set(p["houses"]) == set(H.SYSTEMS)