Bearbeiten: POST /entry/{pid}/edit (Inhalt ändern)

- handleEditEntry: Eigentümerprüfung, nicht-leer, content-only Update
- Bild und last_activity bleiben unverändert; gelöschte Posts nicht editierbar
- Frontend: Bearbeiten-Button + Inline-Formular auf der Focus-Seite

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 13:33:22 +02:00
parent cb3da3bb24
commit ad469ab366
4 changed files with 115 additions and 5 deletions
+48
View File
@@ -318,6 +318,54 @@ func TestThreading(t *testing.T) {
}
}
func TestEditEntry(t *testing.T) {
srv := newTestServer(t)
alice := registerAndLogin(t, srv, "alice")
bob := registerAndLogin(t, srv, "bob")
pid := createEntry(t, alice, srv, "original")
editURL := fmt.Sprintf("%s/entry/%d/edit", srv.URL, pid)
// Eigentümer bearbeitet -> 200, neuer Inhalt sichtbar.
resp := postForm(t, alice, editURL, url.Values{"content": {"korrigiert"}})
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Fatalf("edit: erwartet 200, bekam %d", resp.StatusCode)
}
if tv := getThread(t, srv, pid); tv.Entry.Content != "korrigiert" {
t.Fatalf("inhalt nach edit: %q", tv.Entry.Content)
}
// Leerer Inhalt -> 400.
resp = postForm(t, alice, editURL, url.Values{"content": {" "}})
resp.Body.Close()
if resp.StatusCode != http.StatusBadRequest {
t.Fatalf("leerer edit: erwartet 400, bekam %d", resp.StatusCode)
}
// Fremder -> 403.
resp = postForm(t, bob, editURL, url.Values{"content": {"hijack"}})
resp.Body.Close()
if resp.StatusCode != http.StatusForbidden {
t.Fatalf("fremd-edit: erwartet 403, bekam %d", resp.StatusCode)
}
// Unbekannte pid -> 404.
resp = postForm(t, alice, srv.URL+"/entry/999999/edit", url.Values{"content": {"x"}})
resp.Body.Close()
if resp.StatusCode != http.StatusNotFound {
t.Fatalf("edit unbekannt: erwartet 404, bekam %d", resp.StatusCode)
}
// Nach Soft-Delete ist der Beitrag nicht mehr bearbeitbar (uid=0) -> 403.
postForm(t, alice, fmt.Sprintf("%s/entry/%d/delete", srv.URL, pid), url.Values{}).Body.Close()
resp = postForm(t, alice, editURL, url.Values{"content": {"wieder da"}})
resp.Body.Close()
if resp.StatusCode != http.StatusForbidden {
t.Fatalf("edit nach delete: erwartet 403, bekam %d", resp.StatusCode)
}
}
func TestSoftDelete(t *testing.T) {
srv := newTestServer(t)
alice := registerAndLogin(t, srv, "alice")