"""Strefa czasowa z lokalizacji (PRE-03). Najważniejsze: offset ma być DST-świadomy i liczony DLA DATY URODZENIA (reguły historyczne), a nie „na sztywno" — inaczej wróciłby dokładnie ten błąd, który PRE-03 ma usunąć (pomylona godzina / czas letni → przeskok Ascendenta). """ import pytest from app import timezone as tz requires_tzfpy = pytest.mark.skipif(tz.get_tz is None, reason="brak tzfpy w środowisku") @requires_tzfpy def test_krakow_summer_is_plus_two_with_dst(): r = tz.resolve(50.0647, 19.945, "1984-06-01", "11:20") assert r["tz"] == "Europe/Warsaw" assert r["offset"] == 2.0 assert r["dst"] is True assert "czas letni" in r["label"] @requires_tzfpy def test_krakow_winter_is_plus_one_without_dst(): r = tz.resolve(50.0647, 19.945, "1984-01-15", "10:00") assert r["offset"] == 1.0 assert r["dst"] is False assert "czas letni" not in r["label"] @requires_tzfpy def test_kathmandu_is_five_forty_five(): """Katmandu +5:45 — sztandarowy przypadek offsetu w 15-minutowym kroku.""" r = tz.resolve(27.7172, 85.3240, "2000-05-01", "08:00") assert r["tz"] == "Asia/Kathmandu" assert r["offset"] == 5.75 assert "+5:45" in r["label"] @requires_tzfpy def test_new_york_dst_differs_by_season(): summer = tz.resolve(40.7128, -74.0060, "2020-07-01", "12:00") winter = tz.resolve(40.7128, -74.0060, "2020-01-01", "12:00") assert summer["offset"] == -4.0 and summer["dst"] is True # EDT assert winter["offset"] == -5.0 and winter["dst"] is False # EST @requires_tzfpy def test_missing_time_defaults_to_noon_not_crash(): r = tz.resolve(50.0647, 19.945, "1984-06-01", "") assert r and r["offset"] == 2.0 @requires_tzfpy def test_bad_date_returns_none_not_exception(): assert tz.resolve(50.0, 19.9, "nonsense", "12:00") is None def test_no_library_degrades_to_none(monkeypatch): """Brak tzfpy nie może wywalić — po prostu bez podpowiedzi (ręczny offset zostaje).""" monkeypatch.setattr(tz, "get_tz", None) assert tz.resolve(50.0, 19.9, "1984-06-01", "11:20") is None # ---- endpoint /timezone ---- def _client(): import os os.environ.pop("APP_PASSWORD", None) # bez bramki logowania w teście from starlette.testclient import TestClient from app.main import app return TestClient(app) @requires_tzfpy def test_endpoint_returns_offset_for_a_point(): r = _client().get("/timezone", params={"lat": 50.0647, "lon": 19.945, "date": "1984-06-01", "time": "11:20"}) assert r.status_code == 200 body = r.json() assert body["offset"] == 2.0 and body["tz"] == "Europe/Warsaw" def test_endpoint_404_when_zone_cannot_be_resolved(monkeypatch): """Gdy strefy nie da się ustalić → 404, front zostawia ręczny offset.""" from app import timezone as tzmod monkeypatch.setattr(tzmod, "get_tz", None) r = _client().get("/timezone", params={"lat": 0.0, "lon": 0.0, "date": "2000-01-01"}) assert r.status_code == 404