Reisen: Wohnorte mit Datum, Anreise je Besuch, Umzüge in der Kilometer-Rechnung
- Wohnorte als Liste mit "seit"-Datum (Tabelle travel_homes, ersetzt den einzelnen Wohnort; Migration Schritt 5 übernimmt ihn): Reisen starten beim damals gültigen Wohnort, Wechsel zählen als Umzug, Tage am Wohnort nicht als Reisetage - "In dieser Zeit hier gewohnt" im Besuch: legt Wohnort ab Beginn und den vorherigen wieder ab Ende + 1 Tag an - Anreise je Besuch (automatisch / von zuhause / vom vorherigen Ort): Rundreisen auch mit mehreren Tagen zwischen den Orten - Fix: Besuche bleiben bearbeitbar, auch wenn eine Fotodatei fehlt; Speicherfehler erscheinen im Dialog statt verdeckt dahinter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
56c4f38ef0
commit
1d7497bead
11 files changed
+343
-113
No files matched your search
@@ -114,11 +114,54 @@ def test_reisefotos_ueberleben_aufraeumen(login):
|
||||
assert (DATA_DIR / "uploads" / f).exists()
|
||||
|
||||
|
||||
def test_wohnort_setzen_und_entfernen(login):
|
||||
def test_wohnorte_mit_datum(login):
|
||||
anna, ben = login("anna"), login("ben")
|
||||
berlin = {k: BERLIN[k] for k in ("geonameId", "name", "country", "lat", "lon")}
|
||||
data = anna.put("/api/reisen/wohnort", json=berlin).json()
|
||||
assert data["home"] == berlin
|
||||
assert ben.get("/api/reisen").json()["home"] is None # nur das eigene Konto
|
||||
assert anna.put("/api/reisen/wohnort", json={**berlin, "lat": 99}).status_code == 400
|
||||
assert anna.delete("/api/reisen/wohnort").json()["home"] is None
|
||||
prag = {k: PRAG[k] for k in ("geonameId", "name", "country", "lat", "lon")}
|
||||
anna.post("/api/reisen/wohnorte", json=berlin)
|
||||
data = anna.post("/api/reisen/wohnorte", json={**prag, "since": "2024-01-01"}).json()
|
||||
assert [(h["name"], h["since"]) for h in data["homes"]] == [("Berlin", None), ("Prag", "2024-01-01")]
|
||||
# gleiches Datum ersetzt
|
||||
data = anna.post("/api/reisen/wohnorte", json={**berlin, "since": "2024-01-01"}).json()
|
||||
assert [(h["name"], h["since"]) for h in data["homes"]] == [("Berlin", None), ("Berlin", "2024-01-01")]
|
||||
assert ben.get("/api/reisen").json()["homes"] == []
|
||||
assert anna.post("/api/reisen/wohnorte", json={**berlin, "since": "2024-02-30"}).status_code == 400
|
||||
assert ben.delete(f"/api/reisen/wohnorte/{data['homes'][0]['id']}").status_code == 404
|
||||
assert len(anna.delete(f"/api/reisen/wohnorte/{data['homes'][0]['id']}").json()["homes"]) == 1
|
||||
|
||||
|
||||
def test_hier_gewohnt(login):
|
||||
anna = login("anna")
|
||||
berlin = {k: BERLIN[k] for k in ("geonameId", "name", "country", "lat", "lon")}
|
||||
anna.post("/api/reisen/wohnorte", json=berlin)
|
||||
prag = anna.post("/api/reisen/staedte", json=PRAG).json()["cities"][0]
|
||||
visit = anna.post(f"/api/reisen/staedte/{prag['id']}/besuche", json={"dateFrom": "2023-07-27", "dateTo": "2024-06-16"}).json()["visits"][0]
|
||||
data = anna.post(f"/api/reisen/besuche/{visit['id']}/gewohnt").json()
|
||||
assert [(h["name"], h["since"]) for h in data["homes"]] == [("Berlin", None), ("Prag", "2023-07-27"), ("Berlin", "2024-06-17")]
|
||||
# Ohne "Bis" kein Aufenthalt
|
||||
kurz = anna.post(f"/api/reisen/staedte/{prag['id']}/besuche", json={"dateFrom": "2025-01-01"}).json()["visits"][0]
|
||||
assert anna.post(f"/api/reisen/besuche/{kurz['id']}/gewohnt").status_code == 400
|
||||
|
||||
|
||||
def test_anreise_je_besuch(login):
|
||||
anna = login("anna")
|
||||
prag = anna.post("/api/reisen/staedte", json=PRAG).json()["cities"][0]
|
||||
url = f"/api/reisen/staedte/{prag['id']}/besuche"
|
||||
data = anna.post(url, json={"dateFrom": "2024-05-01", "continued": True}).json()
|
||||
assert data["visits"][0]["continued"] is True
|
||||
v = data["visits"][0]
|
||||
data = anna.put(f"/api/reisen/besuche/{v['id']}", json={**v, "continued": None}).json()
|
||||
assert data["visits"][0]["continued"] is None
|
||||
assert anna.post(url, json={"dateFrom": "2024-05-01", "continued": "ja"}).status_code == 400
|
||||
|
||||
|
||||
def test_besuch_bearbeitbar_wenn_fotodatei_fehlt(login):
|
||||
anna = login("anna")
|
||||
prag = anna.post("/api/reisen/staedte", json=PRAG).json()["cities"][0]
|
||||
f = foto(anna)
|
||||
v = anna.post(f"/api/reisen/staedte/{prag['id']}/besuche", json={"dateFrom": "2023-05-01", "photos": [f]}).json()["visits"][0]
|
||||
(DATA_DIR / "uploads" / f).unlink()
|
||||
res = anna.put(f"/api/reisen/besuche/{v['id']}", json={**v, "notes": "geändert"})
|
||||
assert res.status_code == 200 and res.json()["visits"][0]["notes"] == "geändert"
|
||||
# Neue, nicht vorhandene Fotos werden weiter abgelehnt
|
||||
assert anna.put(f"/api/reisen/besuche/{v['id']}", json={**v, "photos": [f, "9e" * 12 + ".jpg"]}).status_code == 400
|
||||
Reference in new issue
Block a user