Files
astrololo/services/presentation/tests/test_static_js.py
T
gitea 740ed2302e
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m23s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m53s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 34s
Testy / Kontrola składni wszystkich warstw (push) Successful in 25s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m3s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m52s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 35s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 22s
fix(prezentacja): offset wzgledem GMT + nazwa lokalizacji po „Tu i teraz”
Dwie pierwsze wskazowki od partnerow biznesowych; pozostale piec zapisane jako
wymagania (PRE-21..PRE-24) do zrobienia w kolejnych krokach.

PRE-19 — offset wzgledem GMT. Etykieta mowila „Strefa (offset h)”, czyli nie
bylo jasne, wzgledem czego liczymy przesuniecie. Teraz „Offset wzgledem GMT (h)”
z podpowiedzia. Krok juz byl 15-minutowy (0,25 h) — dolozony zakres −12…+14,
zeby nie dalo sie wpisac strefy, ktora nie istnieje. Zmiana w trzech zakladkach,
ktore maja to pole (Horoskop, Interpretacje, Kalendarz).

PRE-20 — po „Tu i teraz” wspolrzedne i pineska skakaly na biezace polozenie, ale
w polu tekstowym zostawala STARA, wczesniej wpisana nazwa. Formularz pokazywal
jedno miejsce, a liczyl dla innego — cicha pomylka, nic sie nie wywalalo.
Handler zdarzenia astrololo:coords odswieza teraz nazwe przez reverseName.

Przy okazji druga strona tego samego bledu: reverseName czysci pole ZANIM
wysle zapytanie. Gdyby /reverse nie odpowiedzialo (brak sieci), zostalaby stara
nazwa — lepiej puste pole i poprawne wspolrzedne niz nazwa, ktora klamie.

Wymagania: PRE-19/20 (zrobione), PRE-21 wspolne dane miedzy zakladkami wraz
z polem imie i nazwisko, PRE-22 wiele predykcji okresowych w pamieci sesji,
PRE-23 zakladka „Skompiluj”, PRE-24 raport PDF przez LaTeX. Dolozone pytanie
otwarte Q-14 o lancuch LaTeX→PDF (gdzie postawic TeX Live, silnik unicode owy
pod glify, konwersja SVG) — decyzja wplywa na deploy i rozmiar obrazow.

Testy: 12 nowych, strukturalnych na zrodle (JS-a nie uruchomimy, a obie regresje
sa ciche). Sprawdzone sabotazem — po cofnieciu kazdej poprawki czerwienieja.
Calosc: prezentacja 45 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 16:20:52 +02:00

87 lines
3.6 KiB
Python

"""Poprawki zgłoszone przez partnerów: offset względem GMT i lokalizacja po
kliknięciu „Tu i teraz" (PRE-19, PRE-20).
JS-a tu nie uruchomimy, więc pilnujemy tego strukturalnie — tak samo jak
niezmienników klienta HTTP. Obie regresje są ciche (nic się nie wywala, tylko
formularz pokazuje nieprawdę), więc test na źródle jest tu wart więcej niż zwykle.
"""
import pathlib
import pytest
APP = pathlib.Path(__file__).resolve().parents[1] / "app"
TEMPLATES = APP / "templates"
GEO_JS = APP / "static" / "geo.js"
WITH_OFFSET = ("chart.html", "interpret.html", "timeline.html")
# ───────────────────────────── PRE-19: offset względem GMT ───────────────
@pytest.mark.parametrize("name", WITH_OFFSET)
def test_offset_label_says_relative_to_gmt(name):
"""Etykieta musi mówić, WZGLĘDEM CZEGO liczymy przesunięcie."""
html = (TEMPLATES / name).read_text(encoding="utf-8")
assert "Offset względem GMT" in html, f"{name}: etykieta nie mówi o GMT"
@pytest.mark.parametrize("name", WITH_OFFSET)
def test_offset_step_is_quarter_hour(name):
"""Krok 15 minut = 0,25 h. Strefy pół- i ćwierćgodzinne (Indie +5:30,
Nepal +5:45) są realne — przy kroku 1 h nie dało się ich ustawić."""
html = (TEMPLATES / name).read_text(encoding="utf-8")
assert 'name="tz_offset" step="0.25"' in html, f"{name}: krok inny niż 15 minut"
@pytest.mark.parametrize("name", WITH_OFFSET)
def test_offset_range_covers_real_zones(name):
html = (TEMPLATES / name).read_text(encoding="utf-8")
assert 'min="-12"' in html and 'max="14"' in html, f"{name}: brak sensownego zakresu stref"
# ──────────────────── PRE-20: „Tu i teraz" odświeża nazwę miejsca ────────
def _geo_source() -> str:
return GEO_JS.read_text(encoding="utf-8")
def _handler_body() -> str:
"""Ciało handlera zdarzenia astrololo:coords (wysyłanego przez „Tu i teraz").
Szukamy KONKRETNIE `addEventListener`, nie samej nazwy zdarzenia — ta pada
także w komentarzu nagłówkowym pliku i wtedy wycięlibyśmy komentarz zamiast
kodu (test przechodziłby albo padał z niewłaściwego powodu).
"""
src = _geo_source()
start = src.index("addEventListener('astrololo:coords'")
end = src.index("});", start)
return src[start:end]
def test_now_button_handler_refreshes_place_name():
"""REGRESJA: po „Tu i teraz" pineska i współrzędne skakały na nowe miejsce,
a w polu tekstowym zostawała stara nazwa — formularz pokazywał jedno miejsce,
a liczył dla innego."""
assert "reverseName(" in _handler_body(), (
"handler astrololo:coords nie odświeża nazwy miejsca (reverseName)"
)
def test_reverse_name_clears_field_before_lookup():
"""Nazwa jest czyszczona ZANIM przyjdzie odpowiedź. Gdyby /reverse nie
odpowiedziało (brak sieci), zostałaby stara nazwa — czyli pole kłamałoby
o lokalizacji. Lepiej puste pole niż nieprawdziwe."""
src = _geo_source()
start = src.index("function reverseName")
body = src[start:src.index("\n }", start)]
clear_at = body.find("searchEl.value = ''")
fetch_at = body.find("fetch(")
assert clear_at != -1, "reverseName nie czyści pola nazwy"
assert clear_at < fetch_at, "pole czyszczone dopiero po zapytaniu — stara nazwa zdąży zostać"
def test_now_button_still_syncs_map():
"""Odświeżenie nazwy nie może zastąpić przesunięcia pineski i widoku mapy."""
body = _handler_body()
assert "marker.setLatLng" in body and "map.setView" in body