Rene: 'Züchter sollten mehr Einfluss haben — Wurfnamen (B-Wurf), Mitglied- schaften und Zertifikate fürs Profil.' - Wurfnamen: Infrastruktur existierte komplett (wurf_rang/wurf_name in DB, Backend, Wurfverwaltungs-Formular) — war nur im Editor und auf der öffentlichen Seite unsichtbar. Editor-Karten zeigen jetzt 'B-Wurf · Name' (Feldname-Bug geburtsdatum→geburt_datum), öffentliche Wurf-Karten bekommen den Rang/Namen als Badge, Hinweis im Editor verlinkt zur Vergabe. - 'undefined Medien': my-editor lieferte kein foto_count (+photos fürs Profil-Grid) — ergänzt. - NEU Mitgliedschaften & Zertifikate: entity_type 'certificate' im Foto- System (Ownership wie breeder), Editor-Sektion mit Upload (Bezeichnung als Caption) + Löschen, öffentliche Profilseite zeigt eigene Sektion mit Logos/Urkunden (klickbar, lazy). Public-Endpoint liefert result.zertifikate. Tests: my-editor inkl. Wurfname/foto_count, Zertifikat-Roundtrip bis zur öffentlichen Seite. Suite: 61 passed.
78 lines
3.5 KiB
Python
78 lines
3.5 KiB
Python
"""Smoke-Tests fuer den Zuechter-Profil-Editor-Endpoint (/breeder/my-editor)."""
|
|
|
|
|
|
def test_my_editor_requires_breeder(client, user):
|
|
r = client.get("/api/breeder/my-editor", headers=user["headers"])
|
|
assert r.status_code == 403
|
|
|
|
|
|
def test_my_editor_without_profile_404(client, admin):
|
|
"""Admin ohne Zuechterprofil -> klare 404-Meldung statt Frontend-Crash."""
|
|
r = client.get("/api/breeder/my-editor", headers=admin["headers"])
|
|
assert r.status_code == 404
|
|
assert "Profil" in r.json()["detail"]
|
|
|
|
|
|
def test_my_editor_with_profile(client, user):
|
|
"""Zuechter mit Profil -> profile (inkl. photos/certificates) + litters mit Namen + storage."""
|
|
from database import db
|
|
with db() as conn:
|
|
uid = conn.execute("SELECT id FROM users WHERE email=?", (user["email"],)).fetchone()["id"]
|
|
conn.execute("UPDATE users SET rolle='breeder', breeder_status='approved' WHERE id=?", (uid,))
|
|
conn.execute(
|
|
"""INSERT INTO breeder_profiles (user_id, zwingername, rasse_text, verein, stadt)
|
|
VALUES (?,?,?,?,?)""",
|
|
(uid, "Vom Teststall", "Labrador", "VDH", "Ebersberg")
|
|
)
|
|
bid = conn.execute("SELECT last_insert_rowid()").fetchone()[0]
|
|
conn.execute(
|
|
"INSERT INTO litters (breeder_id, wurf_rang, wurf_name, welpen_gesamt) VALUES (?,?,?,?)",
|
|
(bid, "B", "Bergfest-Wurf", 6)
|
|
)
|
|
r = client.get("/api/breeder/my-editor", headers=user["headers"])
|
|
assert r.status_code == 200, r.text
|
|
d = r.json()
|
|
assert d["profile"]["zwingername"] == "Vom Teststall"
|
|
assert isinstance(d["profile"]["photos"], list)
|
|
assert isinstance(d["profile"]["certificates"], list)
|
|
assert d["litters"][0]["wurf_rang"] == "B"
|
|
assert d["litters"][0]["foto_count"] == 0 # kein 'undefined Medien' mehr
|
|
assert d["storage_limit_mb"] == 200
|
|
assert d["storage_mb"] >= 0
|
|
|
|
|
|
def test_certificate_upload_and_public_profile(client, user):
|
|
"""Zertifikat hochladen -> erscheint im Editor UND auf der oeffentlichen Profilseite."""
|
|
import io
|
|
from PIL import Image
|
|
from database import db
|
|
with db() as conn:
|
|
uid = conn.execute("SELECT id FROM users WHERE email=?", (user["email"],)).fetchone()["id"]
|
|
conn.execute("UPDATE users SET rolle='breeder', breeder_status='approved' WHERE id=?", (uid,))
|
|
conn.execute(
|
|
"""INSERT INTO breeder_profiles (user_id, zwingername, rasse_text, verein, stadt)
|
|
VALUES (?,?,?,?,?)""",
|
|
(uid, "Zertifikat-Zwinger", "Collie", "VDH", "Ebersberg")
|
|
)
|
|
bid = conn.execute("SELECT last_insert_rowid()").fetchone()[0]
|
|
|
|
buf = io.BytesIO()
|
|
Image.new("RGB", (64, 64), "gold").save(buf, format="PNG")
|
|
buf.seek(0)
|
|
r = client.post("/api/breeder/photos/upload", headers=user["headers"],
|
|
data={"entity_type": "certificate", "entity_id": str(bid),
|
|
"visibility": "public", "caption": "VDH-Mitglied"},
|
|
files={"file": ("vdh.png", buf, "image/png")})
|
|
assert r.status_code == 200, r.text
|
|
|
|
# Editor liefert das Zertifikat
|
|
r = client.get("/api/breeder/my-editor", headers=user["headers"])
|
|
certs = r.json()["profile"]["certificates"]
|
|
assert len(certs) == 1 and certs[0]["caption"] == "VDH-Mitglied"
|
|
|
|
# Oeffentliche Profilseite (ohne Login) zeigt es
|
|
r = client.get("/api/breeder/profil/Zertifikat-Zwinger")
|
|
assert r.status_code == 200, r.text
|
|
z = r.json()["zertifikate"]
|
|
assert len(z) == 1 and z[0]["caption"] == "VDH-Mitglied"
|
|
assert z[0]["url"].startswith("/media/")
|