5c82e8bd9f
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>
87 lines
3.6 KiB
Python
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
|