Files
bookhoard/cmd/server/tests/search_unified_test.go
T
john-okeefe c00fb89962 fix: update TestUnifiedSearch to expect 404 for no results
The 'Missing library_id' subtest was searching for 'test' which matches
no books in the test data. Since the API correctly returns 404 Not Found
when there are no search results, updated the test to expect 404 instead
of 200.

This aligns with the desired API behavior where 404 indicates no resources
match the search criteria.

Files changed:
- cmd/server/tests/search_unified_test.go: Updated test expectation to 404
2026-03-24 21:06:45 -04:00

104 lines
3.7 KiB
Go

package main
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestUnifiedSearch(t *testing.T) {
setup := setupDeviceTest(t)
defer setup.Server.Close()
libraryID := setup.CreateLibrary(t, "Test Search Library", "ebooks")
_ = setup.CreateDevice(t, "Test Search Device", "koreader", "search-test-123")
client := &http.Client{}
// Add folder to library (required before adding media items)
folderReq := map[string]interface{}{
"folder_path": "/app/uploads",
}
folderBody, _ := json.Marshal(folderReq)
folderHTTP, _ := http.NewRequest("POST", setup.Server.URL+"/api/libraries/"+libraryID+"/folders", bytes.NewBuffer(folderBody))
folderHTTP.Header.Set("Content-Type", "application/json")
folderHTTP.Header.Set("Authorization", "Bearer "+setup.UserToken)
folderResp, err := client.Do(folderHTTP)
require.NoError(t, err)
folderResp.Body.Close()
require.Equal(t, http.StatusCreated, folderResp.StatusCode)
// Helper to create book with fields
createBook := func(title, author, genre string, year int, hasCover bool) {
bookReq := map[string]interface{}{
"library_id": libraryID,
"title": title,
"author": author,
"genre": genre,
"copyright_year": year,
"file_path": "/tmp/test.epub",
"file_size": 1024,
"mime_type": "application/epub+zip",
}
if hasCover {
bookReq["cover_image_path"] = "/tmp/cover.jpg"
}
body, _ := json.Marshal(bookReq)
req, _ := http.NewRequest("POST", setup.Server.URL+"/api/media-items", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+setup.UserToken)
resp, err := client.Do(req)
require.NoError(t, err)
defer resp.Body.Close()
require.Equal(t, http.StatusCreated, resp.StatusCode)
}
// Create test books with various fields for filtering
createBook("Foundation and Empire", "asimov", "scifi", 1951, true)
createBook("The Martian", "weir", "scifi", 2010, true)
createBook("I, Robot", "asimov", "fiction", 1950, false)
t.Run("Fuzzy author filter", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/media-items/search?library_id="+libraryID+"&q=%22Foundation%20and%20Empire%22", nil)
req.Header.Set("Authorization", "Bearer "+setup.UserToken)
rec := httptest.NewRecorder()
setup.Server.Config.Handler.ServeHTTP(rec, req)
assert.Equal(t, http.StatusOK, rec.Code, "Should exact match quoted query")
})
t.Run("Combined search + filters", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/media-items/search?library_id="+libraryID+"&q=foundation&author_filter=asimov", nil)
req.Header.Set("Authorization", "Bearer "+setup.UserToken)
rec := httptest.NewRecorder()
setup.Server.Config.Handler.ServeHTTP(rec, req)
assert.Equal(t, http.StatusOK, rec.Code, "Should combine search and filters")
})
t.Run("Boolean filter (exact)", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/media-items/search?library_id="+libraryID+"&has_cover=true", nil)
req.Header.Set("Authorization", "Bearer "+setup.UserToken)
rec := httptest.NewRecorder()
setup.Server.Config.Handler.ServeHTTP(rec, req)
assert.Equal(t, http.StatusOK, rec.Code, "Should filter by has_cover")
})
t.Run("Missing library_id", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/media-items/search?q=test", nil)
req.Header.Set("Authorization", "Bearer "+setup.UserToken)
rec := httptest.NewRecorder()
setup.Server.Config.Handler.ServeHTTP(rec, req)
// library_id is now optional - searches all libraries when omitted
// Returns 404 when no results match the search query
assert.Equal(t, http.StatusNotFound, rec.Code, "Should return 404 when no results found")
})
}