"""Konfigurowalne aspekty i orby w UI (PRE-06). Ustawienia muszą: (1) być na obu formularzach (Horoskop i Skompiluj), (2) wędrować między zakładkami (formsync), (3) trafiać do logiki na ekran i do PDF-a — inaczej podsumowanie liczyłoby aspekty innym orbem niż horoskop (ta sama klasa błędu co regresja podsumowania). """ import pathlib APP = pathlib.Path(__file__).resolve().parents[1] / "app" CHART = (APP / "templates" / "chart.html").read_text(encoding="utf-8") COMPILE = (APP / "templates" / "compile.html").read_text(encoding="utf-8") OPTS = (APP / "templates" / "_form_options.html").read_text(encoding="utf-8") # wspólne opcje obu formularzy MAIN = (APP / "main.py").read_text(encoding="utf-8") CLIENT = (APP / "clients" / "logic_client.py").read_text(encoding="utf-8") SYNC = (APP / "static" / "formsync.js").read_text(encoding="utf-8") COMPILE_JS = (APP / "static" / "compile.js").read_text(encoding="utf-8") FIELDS = ("aspect_orb", "aspect_luminary_bonus", "aspect_minor") def test_both_forms_have_aspect_settings(): """Pola są we WSPÓLNYM pliku opcji, który oba formularze dołączają.""" for f in FIELDS: assert f'name="{f}"' in OPTS, f"brak {f} we wspólnym pliku opcji" assert '{% include "_form_options.html" %}' in CHART assert '{% include "_form_options.html" %}' in COMPILE def test_handlers_accept_and_pass_aspect_settings(): # co najmniej Horoskop i Skompiluj przekazują orb do logiki (synastria też — 3) assert MAIN.count("aspect_orb=aspect_orb") >= 2 assert "aspect_minor: bool = Form(False)" in MAIN def test_client_forwards_aspect_settings(): for f in FIELDS: assert f'"{f}": {f}' in CLIENT, f"klient nie przekazuje {f}" def test_settings_are_synced_between_tabs(): for f in FIELDS: assert f"'{f}'" in SYNC, f"formsync nie synchronizuje {f}" def test_pdf_payload_includes_aspect_settings(): assert "aspect_orb: v('aspect_orb')" in COMPILE_JS assert "aspect_minor: checked('aspect_minor')" in COMPILE_JS def test_pdf_handler_reads_aspect_settings(): assert 'aspect_orb=float(data.get("aspect_orb")' in MAIN assert 'aspect_minor=bool(data.get("aspect_minor"))' in MAIN