"""Pydantic-Validation-Tests: max_length verhindert massive Payloads. Sprint60 hat in forum.py und diary.py max_length-Felder eingefuehrt (titel<=200, text<=10000). Wir testen, dass ueberlange Eingaben SOFORT mit 422 abgelehnt werden — bevor sie in die DB gelangen. """ from __future__ import annotations # ================================================================== # Forum — ThreadCreate # ================================================================== class TestForumValidation: def test_forum_thread_with_overlong_title_is_422(self, client, user): """30000-Zeichen-Titel -> 422 (max_length=200).""" r = client.post( "/api/forum/threads", headers=user["headers"], json={ "kategorie": "allgemein", "titel": "T" * 30_000, "text": "Inhalt", }, ) assert r.status_code == 422, ( f"Erwartete 422 (max_length), bekam {r.status_code}: {r.text[:200]}" ) def test_forum_thread_with_overlong_text_is_422(self, client, user): """50000-Zeichen-Text -> 422 (max_length=10000).""" r = client.post( "/api/forum/threads", headers=user["headers"], json={ "kategorie": "allgemein", "titel": "Ok-Titel", "text": "X" * 50_000, }, ) assert r.status_code == 422, ( f"Erwartete 422, bekam {r.status_code}: {r.text[:200]}" ) def test_forum_thread_at_max_length_passes_validation(self, client, user): """200-Zeichen-Titel + 10000-Zeichen-Text muss durchgehen.""" r = client.post( "/api/forum/threads", headers=user["headers"], json={ "kategorie": "allgemein", "titel": "T" * 200, "text": "X" * 10_000, }, ) # Darf nicht 422 sein — moegliche Codes 200/201/400 sind ok assert r.status_code != 422, ( f"Grenzwerte sollten validieren, bekam 422: {r.text[:200]}" ) # ================================================================== # Diary — DiaryCreate # ================================================================== class TestDiaryValidation: def test_diary_with_overlong_text_is_422(self, client, user, dog): """50000-Zeichen-Text -> 422 (max_length=10000).""" r = client.post( f"/api/dogs/{dog['id']}/diary", headers=user["headers"], json={ "titel": "Mein Eintrag", "text": "X" * 50_000, }, ) assert r.status_code == 422, ( f"Erwartete 422, bekam {r.status_code}: {r.text[:200]}" ) def test_diary_with_overlong_title_is_422(self, client, user, dog): """5000-Zeichen-Titel -> 422 (max_length=200).""" r = client.post( f"/api/dogs/{dog['id']}/diary", headers=user["headers"], json={ "titel": "T" * 5_000, "text": "kurzer Text", }, ) assert r.status_code == 422, ( f"Erwartete 422, bekam {r.status_code}: {r.text[:200]}" ) def test_diary_with_normal_payload_succeeds(self, client, user, dog): """Sanity-Check: normaler Eintrag geht durch.""" r = client.post( f"/api/dogs/{dog['id']}/diary", headers=user["headers"], json={ "titel": "Normal", "text": "Normaler Text-Inhalt.", }, ) assert r.status_code in (200, 201), r.text