"""Wspólne dane formularza między zakładkami + pole imienia (PRE-21). Znów test strukturalny na źródle: synchronizacja żyje w JS, a jej awaria jest CICHA — formularz po prostu przestaje pamiętać dane i użytkownik wpisuje je od nowa. Pilnujemy więc reguł, które łatwo zgubić przy kolejnych zmianach. """ import pathlib import pytest APP = pathlib.Path(__file__).resolve().parents[1] / "app" TEMPLATES = APP / "templates" SYNC_JS = (APP / "static" / "formsync.js").read_text(encoding="utf-8") GEO_JS = (APP / "static" / "geo.js").read_text(encoding="utf-8") BASE_HTML = (TEMPLATES / "base.html").read_text(encoding="utf-8") MAIN_PY = (APP / "main.py").read_text(encoding="utf-8") WITH_FORM = ("chart.html", "interpret.html", "timeline.html") # Pola, które mają wędrować między zakładkami. Gdy dojdzie nowe wspólne pole, # ten wykaz ma się nie rozjechać z formsync.js. SHARED = ("person", "date", "time", "tz_offset", "lat", "lon", "house_system", "zodiac", "place") # ─────────────────────────────── pole imienia ──────────────────────────── @pytest.mark.parametrize("name", WITH_FORM) def test_person_field_present_on_every_form(name): """Imię i nazwisko trafia do nagłówka raportu PDF (PRE-24) — musi dać się je wpisać z każdej zakładki, bo dane są wspólne.""" html = (TEMPLATES / name).read_text(encoding="utf-8") assert 'name="person"' in html, f"{name}: brak pola imienia" @pytest.mark.parametrize("name", WITH_FORM) def test_person_value_survives_submit(name): """Po wysłaniu formularza pole ma pokazywać to, co wpisano — inaczej znikałoby przy każdym przeliczeniu.""" html = (TEMPLATES / name).read_text(encoding="utf-8") assert "form.person" in html, f"{name}: wartość imienia nie wraca po POST" def test_handlers_accept_and_echo_person(): """Każdy handler renderujący formularz przyjmuje `person` i wkłada go z powrotem do `form` — inaczej imię znikałoby po przeliczeniu. Cztery: Horoskop, Interpretacje, Kalendarz, Skompiluj (PRE-23).""" assert MAIN_PY.count("person: str = Form") == 4 assert MAIN_PY.count('"person": person') == 4 # ─────────────────────── synchronizacja między zakładkami ──────────────── @pytest.mark.parametrize("key", SHARED) def test_every_shared_field_is_synced(key): assert f"'{key}'" in SYNC_JS, f"pole {key} nie jest synchronizowane" def test_sync_script_loaded_before_map_script(): """KOLEJNOŚĆ MA ZNACZENIE: formsync w z `defer` wykonuje się przed geo.js (skrypty defer idą w kolejności dokumentu), więc mapa startuje już z odtworzonymi współrzędnymi zamiast skakać po chwili.""" assert "formsync.js" in BASE_HTML, "formsync.js nie jest ładowany globalnie" assert "defer" in BASE_HTML.split("formsync.js")[0].rsplit("