"""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/")