"""Tests der sichtbaren Seiten.""" import io import re from PIL import Image def bild_bytes() -> bytes: puffer = io.BytesIO() Image.new("RGB", (600, 800), (120, 160, 200)).save(puffer, "JPEG") return puffer.getvalue() def csrf_aus(html: str) -> str: treffer = re.search(r'name="csrf" value="([^"]+)"', html) assert treffer, "kein CSRF-Token im Formular" return treffer.group(1) def erfasse(client, kategorie_id, **felder): """Legt über das Formular ein Kleidungsstück an.""" seite = client.get("/erfassen") daten = { "csrf": csrf_aus(seite.text), "size": "98/104", "category_id": str(kategorie_id), "gender": "unisex", "season": "all_year", "condition": "good", "title": "", "description": "", } daten.update(felder) return client.post("/erfassen", data=daten, follow_redirects=True) # --------------------------------------------------------------- Galerie --- def test_galerie_ist_ohne_anmeldung_sichtbar(gast): antwort = gast.get("/") assert antwort.status_code == 200 assert "Kleider-Börse" in antwort.text def test_galerie_zeigt_erfasstes(client, gast, kategorie_id): erfasse(client, kategorie_id, title="Rote Winterjacke") client.post("/abmelden", data={"csrf": csrf_aus(client.get("/").text)}) seite = gast.get("/") assert "Rote Winterjacke" in seite.text def test_abgeleiteter_titel_erscheint(client, kategorie_id): """Titel leer gelassen - dann bildet ihn die Anwendung.""" erfasse(client, kategorie_id, size="80") seite = client.get("/") assert "80" in seite.text def test_filter_liefert_nur_die_liste(client, kategorie_id): """HTMX tauscht nur den Ausschnitt aus, nicht die ganze Seite.""" erfasse(client, kategorie_id, size="80", title="Kleines Teil") erfasse(client, kategorie_id, size="122", title="Grosses Teil") ausschnitt = client.get("/teil/liste?size=80") assert ausschnitt.status_code == 200 assert "Kleines Teil" in ausschnitt.text assert "Grosses Teil" not in ausschnitt.text # Kein vollständiges Dokument assert " stehen" # und darf nicht verzögert werden zeile = html[html.rindex("", theme) + 1] assert "defer" not in zeile and "async" not in zeile def test_umschalter_ist_vorhanden(client): assert 'id="schema-knopf"' in client.get("/").text # ------------------------------------------------- Unsinnige Eingaben --- def test_unsinniges_limit_ist_kein_serverfehler(gast): """?limit= kommt aus der URL - Buchstaben oder negative Werte dürfen keinen 500er auslösen, sondern fallen auf die Seitengrösse zurück.""" assert gast.get("/?limit=abc").status_code == 200 assert gast.get("/teil/liste?limit=-5").status_code == 200 def test_unsinnige_kategorie_gibt_meldung_statt_500(client, kategorie_id): antwort = erfasse(client, kategorie_id, category_id="abc") assert antwort.status_code == 200 assert "Bitte die Angaben prüfen" in antwort.text def test_zu_langer_titel_gibt_meldung_statt_500(client, kategorie_id): """maxlength im HTML schützt nur den Browserweg - die Anwendung muss es selbst abfangen.""" antwort = erfasse(client, kategorie_id, title="x" * 101) assert antwort.status_code == 200 assert "Bitte die Angaben prüfen" in antwort.text