The 10k validator cap rejected legitimate long-form notes — a scholarly reading note with quoted passages and footnotes lands around 10.1k chars and failed at save with the raw validator error. Raise the cap to 100,000 on all six annotation text fields in the media handler request structs: - CreateMediaNoteRequest / UpdateMediaNoteRequest Content - CreateMediaHighlightRequest / UpdateMediaHighlightRequest NoteText - CreateMediaBookmarkRequest / UpdateMediaBookmarkRequest Notes No other layer changes: the media_notes / media_highlights columns are unbounded TEXT, and the KOReader + websocket sync paths never had a length cap, so the REST API now matches the rest of the system instead of being the strictest gate. New integration test pins the boundary: 50k and 100k-char notes return 201, 100,001 chars returns 400.
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestMediaNoteLengthLimits verifies the note content validator cap
|
|
// (internal/handlers/media.go): content up to 100,000 chars is accepted,
|
|
// longer content is rejected with 400.
|
|
func TestMediaNoteLengthLimits(t *testing.T) {
|
|
setup := setupTestServer(t)
|
|
|
|
token := setup.Token
|
|
mediaItemID := createTestMediaItemID(t, setup)
|
|
|
|
postNote := func(content string) int {
|
|
payload := map[string]interface{}{
|
|
"content": content,
|
|
"position": "page:1",
|
|
}
|
|
body, _ := json.Marshal(payload)
|
|
req, _ := http.NewRequest("POST", setup.Server.URL+"/api/media-items/"+mediaItemID+"/notes", bytes.NewBuffer(body))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
|
|
client := &http.Client{}
|
|
resp, err := client.Do(req)
|
|
require.NoError(t, err)
|
|
defer func(Body io.ReadCloser) {
|
|
_ = Body.Close()
|
|
}(resp.Body)
|
|
return resp.StatusCode
|
|
}
|
|
|
|
t.Run("50k-char note accepted", func(t *testing.T) {
|
|
assert.Equal(t, http.StatusCreated, postNote(strings.Repeat("a", 50000)))
|
|
})
|
|
|
|
t.Run("100k-char note accepted at boundary", func(t *testing.T) {
|
|
assert.Equal(t, http.StatusCreated, postNote(strings.Repeat("b", 100000)))
|
|
})
|
|
|
|
t.Run("over-limit note rejected", func(t *testing.T) {
|
|
assert.Equal(t, http.StatusBadRequest, postNote(strings.Repeat("c", 100001)))
|
|
})
|
|
}
|