fix(tests): handle all Close() and Decode() errors across integration tests

Replace all unhandled resp.Body.Close() calls throughout the test suite:

- Deferred calls: replace 'defer VAR.Body.Close()' with a closure that explicitly
  discards the error via 'defer func(Body io.ReadCloser) { _ = Body.Close() }(VAR.Body)'
- Immediate calls: replace 'VAR.Body.Close()' with '_ = VAR.Body.Close()'

Replace all unhandled json.NewDecoder(VAR.Body).Decode(&x) calls with error capture
and require.NoError assertion. Files using httptest.ResponseRecorder (collections_preview,
processing_issues) use 'err :=' declaration; suite-style tests (scanner_integration,
dashboard_integration) use s.T() instead of t.
This commit is contained in:
2026-04-21 20:33:05 -04:00
parent 8baecad379
commit a6700f73e0
28 changed files with 1065 additions and 414 deletions
+104 -38
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -27,7 +28,9 @@ func TestBookMatchingQueryBooks(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -47,12 +50,15 @@ func TestBookMatchingQueryBooks(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "matches") assert.Contains(t, result, "matches")
assert.Contains(t, result, "action") assert.Contains(t, result, "action")
@@ -67,7 +73,9 @@ func TestBookMatchingQueryBooks(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -85,12 +93,15 @@ func TestBookMatchingQueryBooks(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
var matches []interface{} var matches []interface{}
if matchesIf, ok := result["matches"]; ok && matchesIf != nil { if matchesIf, ok := result["matches"]; ok && matchesIf != nil {
@@ -124,7 +135,9 @@ func TestBookMatchingBulkLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -142,12 +155,15 @@ func TestBookMatchingBulkLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 0.0, result["total"]) assert.Equal(t, 0.0, result["total"])
assert.Equal(t, 0.0, result["successful"]) assert.Equal(t, 0.0, result["successful"])
@@ -175,12 +191,15 @@ func TestBookMatchingBulkLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -221,12 +240,15 @@ func TestBookMatchingBulkLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 3.0, result["total"]) assert.Equal(t, 3.0, result["total"])
results := result["results"].([]interface{}) results := result["results"].([]interface{})
@@ -251,7 +273,9 @@ func TestBookMatchingAutoLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -267,12 +291,15 @@ func TestBookMatchingAutoLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "auto_linked") assert.Contains(t, result, "auto_linked")
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
@@ -292,12 +319,15 @@ func TestBookMatchingAutoLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "auto_linked") assert.Contains(t, result, "auto_linked")
}) })
@@ -315,12 +345,15 @@ func TestBookMatchingAutoLink(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
// Should succeed even with no books to link // Should succeed even with no books to link
assert.Contains(t, result, "auto_linked") assert.Contains(t, result, "auto_linked")
@@ -338,7 +371,9 @@ func TestBookMatchingSuggestions(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -350,7 +385,9 @@ func TestBookMatchingSuggestions(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -363,7 +400,9 @@ func TestBookMatchingSuggestions(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
}) })
@@ -378,7 +417,9 @@ func TestBookMatchingSuggestions(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Even when book not found, we expect 404 // Even when book not found, we expect 404
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
@@ -396,7 +437,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -409,12 +452,15 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "device_id") assert.Contains(t, result, "device_id")
assert.Contains(t, result, "aliases") assert.Contains(t, result, "aliases")
@@ -439,7 +485,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -462,7 +510,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -485,7 +535,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -505,7 +557,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -519,7 +573,9 @@ func TestBookMatchingDeviceFileAliases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -535,7 +591,9 @@ func TestBookMatchingGetBookMatches(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -547,12 +605,15 @@ func TestBookMatchingGetBookMatches(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "matches") assert.Contains(t, result, "matches")
assert.Contains(t, result, "action") assert.Contains(t, result, "action")
@@ -565,7 +626,9 @@ func TestBookMatchingGetBookMatches(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -577,12 +640,15 @@ func TestBookMatchingGetBookMatches(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "matches") assert.Contains(t, result, "matches")
}) })
+71 -27
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -44,7 +45,9 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -61,7 +64,9 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -85,12 +90,15 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -122,10 +130,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(collectionHTTP) resp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult map[string]interface{} var collectionResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult) err = json.NewDecoder(resp.Body).Decode(&collectionResult)
require.NoError(t, err)
collectionID := collectionResult["id"].(string) collectionID := collectionResult["id"].(string)
// Now try to add invalid book IDs // Now try to add invalid book IDs
@@ -145,12 +156,15 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(addHTTP) resp, err = client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
results := result["results"].([]interface{}) results := result["results"].([]interface{})
firstResult := results[0].(map[string]interface{}) firstResult := results[0].(map[string]interface{})
@@ -171,10 +185,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(collectionHTTP) resp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult map[string]interface{} var collectionResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult) err = json.NewDecoder(resp.Body).Decode(&collectionResult)
require.NoError(t, err)
collectionID := collectionResult["id"].(string) collectionID := collectionResult["id"].(string)
// Create a book // Create a book
@@ -197,12 +214,15 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(addHTTP) resp, err = client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -228,10 +248,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(collectionHTTP) resp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult map[string]interface{} var collectionResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult) err = json.NewDecoder(resp.Body).Decode(&collectionResult)
require.NoError(t, err)
collectionID := collectionResult["id"].(string) collectionID := collectionResult["id"].(string)
// Create multiple books // Create multiple books
@@ -256,12 +279,15 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(addHTTP) resp, err = client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 3.0, result["total"]) assert.Equal(t, 3.0, result["total"])
assert.True(t, result["added"].(float64) > 0) assert.True(t, result["added"].(float64) > 0)
@@ -281,10 +307,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(collectionHTTP) resp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult1 map[string]interface{} var collectionResult1 map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult1) err = json.NewDecoder(resp.Body).Decode(&collectionResult1)
require.NoError(t, err)
collectionID1 := collectionResult1["id"].(string) collectionID1 := collectionResult1["id"].(string)
collectionReq2 := map[string]interface{}{ collectionReq2 := map[string]interface{}{
@@ -299,10 +328,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(collectionHTTP2) resp, err = client.Do(collectionHTTP2)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult2 map[string]interface{} var collectionResult2 map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult2) err = json.NewDecoder(resp.Body).Decode(&collectionResult2)
require.NoError(t, err)
collectionID2 := collectionResult2["id"].(string) collectionID2 := collectionResult2["id"].(string)
// Create books // Create books
@@ -330,12 +362,15 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(addHTTP) resp, err = client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Equal(t, 3.0, result["total"]) assert.Equal(t, 3.0, result["total"])
@@ -355,10 +390,13 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(collectionHTTP) resp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var collectionResult map[string]interface{} var collectionResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&collectionResult) err = json.NewDecoder(resp.Body).Decode(&collectionResult)
require.NoError(t, err)
collectionID := collectionResult["id"].(string) collectionID := collectionResult["id"].(string)
// Create a book // Create a book
@@ -381,7 +419,9 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err = client.Do(addHTTP) resp, err = client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Try to add same book again - create new request with fresh body // Try to add same book again - create new request with fresh body
addBody2, _ := json.Marshal(addReq) addBody2, _ := json.Marshal(addReq)
@@ -391,7 +431,9 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp2, err := client.Do(addHTTP2) resp2, err := client.Do(addHTTP2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
// Should handle duplicate gracefully (either succeed or return error) // Should handle duplicate gracefully (either succeed or return error)
assert.Equal(t, http.StatusOK, resp2.StatusCode) assert.Equal(t, http.StatusOK, resp2.StatusCode)
@@ -405,7 +447,9 @@ func TestCollectionsBulkOperations(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
+18 -9
View File
@@ -112,7 +112,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 0, len(items), "Empty rules should return no matched items") assert.Equal(t, 0, len(items), "Empty rules should return no matched items")
@@ -139,7 +140,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 2, len(items), "Should return exactly 2 manually selected books") assert.Equal(t, 2, len(items), "Should return exactly 2 manually selected books")
@@ -171,7 +173,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Greater(t, len(items), 0, "Should return books matching the genre rule") assert.Greater(t, len(items), 0, "Should return books matching the genre rule")
@@ -203,7 +206,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Greater(t, len(items), 0, "Should return books from rules and manual selection") assert.Greater(t, len(items), 0, "Should return books from rules and manual selection")
@@ -233,7 +237,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.LessOrEqual(t, len(items), 2, "Should respect limit parameter") assert.LessOrEqual(t, len(items), 2, "Should respect limit parameter")
@@ -259,7 +264,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 1, len(items), "Should still return items when limit exceeds max") assert.Equal(t, 1, len(items), "Should still return items when limit exceeds max")
@@ -285,7 +291,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 1, len(items), "Limit 0 should default to 20 and still return matched items") assert.Equal(t, 1, len(items), "Limit 0 should default to 20 and still return matched items")
@@ -312,7 +319,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 1, len(items), "Invalid book IDs should be skipped, valid ones included") assert.Equal(t, 1, len(items), "Invalid book IDs should be skipped, valid ones included")
@@ -340,7 +348,8 @@ func TestPreviewCollection(t *testing.T) {
assert.Equal(t, http.StatusOK, rec.Code) assert.Equal(t, http.StatusOK, rec.Code)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(rec.Body).Decode(&result) err := json.NewDecoder(rec.Body).Decode(&result)
require.NoError(t, err)
items := result["items"].([]interface{}) items := result["items"].([]interface{})
assert.Equal(t, 1, len(items), "Duplicate book IDs should result in unique items") assert.Equal(t, 1, len(items), "Duplicate book IDs should result in unique items")
+72 -24
View File
@@ -132,7 +132,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -152,7 +154,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -169,7 +173,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -190,7 +196,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -210,7 +218,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -227,7 +237,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -244,7 +256,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -262,7 +276,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -280,7 +296,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -298,7 +316,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -316,7 +336,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -334,7 +356,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -353,7 +377,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -371,7 +397,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -389,7 +417,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -439,7 +469,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -469,7 +501,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -500,7 +534,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -526,7 +562,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -567,7 +605,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -594,7 +634,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/media/"+mediaUUID, nil) req, _ := http.NewRequest("GET", setup.Server.URL+"/media/"+mediaUUID, nil)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode, "Should require authentication") assert.Equal(t, http.StatusUnauthorized, resp.StatusCode, "Should require authentication")
}) })
@@ -610,7 +652,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.RegularToken) req.Header.Set("Authorization", "Bearer "+setup.RegularToken)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -629,7 +673,9 @@ func TestComicMetadataDisplay_ComicDetailPage(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
@@ -719,7 +765,9 @@ func TestComicMetadataDisplay_AllFieldsTogether(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.Token) req.Header.Set("Authorization", "Bearer "+setup.Token)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
body := readBody(resp) body := readBody(resp)
+89 -32
View File
@@ -6,6 +6,7 @@ import (
"bytes" "bytes"
"context" "context"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
"time" "time"
@@ -90,12 +91,15 @@ func TestConflictList_Empty(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.ConflictListResponse var result handlers.ConflictListResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 0, result.Total) assert.Equal(t, 0, result.Total)
assert.Empty(t, result.Conflicts) assert.Empty(t, result.Conflicts)
@@ -112,12 +116,15 @@ func TestConflictList_WithConflicts(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.ConflictListResponse var result handlers.ConflictListResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.GreaterOrEqual(t, result.Total, 1) assert.GreaterOrEqual(t, result.Total, 1)
require.NotEmpty(t, result.Conflicts) require.NotEmpty(t, result.Conflicts)
@@ -140,10 +147,13 @@ func TestConflictList_UnresolvedCount(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var result handlers.ConflictListResponse var result handlers.ConflictListResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.GreaterOrEqual(t, result.Unresolved, 1) assert.GreaterOrEqual(t, result.Unresolved, 1)
} }
@@ -160,12 +170,15 @@ func TestConflictGet_ByID(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var detail handlers.ConflictDetailResponse var detail handlers.ConflictDetailResponse
json.NewDecoder(resp.Body).Decode(&detail) err = json.NewDecoder(resp.Body).Decode(&detail)
require.NoError(t, err)
assert.Equal(t, conflictID, detail.ID) assert.Equal(t, conflictID, detail.ID)
assert.Equal(t, env.mediaID, detail.MediaItemID) assert.Equal(t, env.mediaID, detail.MediaItemID)
@@ -183,7 +196,9 @@ func TestConflictGet_NotFound(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
} }
@@ -197,7 +212,9 @@ func TestConflictGet_InvalidID(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -223,12 +240,15 @@ func TestConflictResolve_ByKOReader(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.ConflictResolveResponse var result handlers.ConflictResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.True(t, result.ConflictResolved) assert.True(t, result.ConflictResolved)
assert.Equal(t, map[string]bool{"progress": true, "annotations": false}, result.AppliedTo) assert.Equal(t, map[string]bool{"progress": true, "annotations": false}, result.AppliedTo)
@@ -254,12 +274,15 @@ func TestConflictResolve_ByKobo(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.ConflictResolveResponse var result handlers.ConflictResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.True(t, result.ConflictResolved) assert.True(t, result.ConflictResolved)
assert.Equal(t, map[string]bool{"progress": true, "annotations": false}, result.AppliedTo) assert.Equal(t, map[string]bool{"progress": true, "annotations": false}, result.AppliedTo)
@@ -290,12 +313,15 @@ func TestConflictResolve_WithManualData(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.ConflictResolveResponse var result handlers.ConflictResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.True(t, result.ConflictResolved) assert.True(t, result.ConflictResolved)
} }
@@ -319,7 +345,9 @@ func TestConflictResolve_ManualWithoutData(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -343,7 +371,9 @@ func TestConflictResolve_AlreadyResolved(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
req2, _ := http.NewRequest("POST", env.setup.Server.URL+"/api/conflicts/"+conflictID+"/resolve", bytes.NewBuffer(body)) req2, _ := http.NewRequest("POST", env.setup.Server.URL+"/api/conflicts/"+conflictID+"/resolve", bytes.NewBuffer(body))
@@ -352,7 +382,9 @@ func TestConflictResolve_AlreadyResolved(t *testing.T) {
resp2, err := client.Do(req2) resp2, err := client.Do(req2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
assert.Equal(t, http.StatusBadRequest, resp2.StatusCode) assert.Equal(t, http.StatusBadRequest, resp2.StatusCode)
} }
@@ -375,7 +407,9 @@ func TestConflictResolve_InvalidWinner(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -395,7 +429,9 @@ func TestConflictResolve_NotFound(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
} }
@@ -412,7 +448,9 @@ func TestConflictDelete(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNoContent, resp.StatusCode) assert.Equal(t, http.StatusNoContent, resp.StatusCode)
@@ -421,7 +459,9 @@ func TestConflictDelete(t *testing.T) {
resp2, err := client.Do(req2) resp2, err := client.Do(req2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
assert.Equal(t, http.StatusNotFound, resp2.StatusCode) assert.Equal(t, http.StatusNotFound, resp2.StatusCode)
} }
@@ -435,7 +475,9 @@ func TestConflictDelete_NotFound(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
} }
@@ -458,7 +500,9 @@ func TestConflictDismissAllResolved(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
req2, _ := http.NewRequest("POST", env.setup.Server.URL+"/api/conflicts/dismiss-all", nil) req2, _ := http.NewRequest("POST", env.setup.Server.URL+"/api/conflicts/dismiss-all", nil)
@@ -466,12 +510,15 @@ func TestConflictDismissAllResolved(t *testing.T) {
resp2, err := client.Do(req2) resp2, err := client.Do(req2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp2.Body).Decode(&result) err = json.NewDecoder(resp2.Body).Decode(&result)
require.NoError(t, err)
deleted, ok := result["deleted"].(float64) deleted, ok := result["deleted"].(float64)
assert.True(t, ok) assert.True(t, ok)
@@ -486,7 +533,9 @@ func TestConflictEndpoints_RequireAuth(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/conflicts", nil) req, _ := http.NewRequest("GET", setup.Server.URL+"/api/conflicts", nil)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -494,7 +543,9 @@ func TestConflictEndpoints_RequireAuth(t *testing.T) {
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/conflicts/"+uuid.New().String(), nil) req, _ := http.NewRequest("GET", setup.Server.URL+"/api/conflicts/"+uuid.New().String(), nil)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -503,7 +554,9 @@ func TestConflictEndpoints_RequireAuth(t *testing.T) {
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -511,7 +564,9 @@ func TestConflictEndpoints_RequireAuth(t *testing.T) {
req, _ := http.NewRequest("DELETE", setup.Server.URL+"/api/conflicts/"+uuid.New().String(), nil) req, _ := http.NewRequest("DELETE", setup.Server.URL+"/api/conflicts/"+uuid.New().String(), nil)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -519,7 +574,9 @@ func TestConflictEndpoints_RequireAuth(t *testing.T) {
req, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/dismiss-all", nil) req, _ := http.NewRequest("POST", setup.Server.URL+"/api/conflicts/dismiss-all", nil)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
} }
+74 -28
View File
@@ -4,6 +4,7 @@ import (
"bookhoard/internal/handlers" "bookhoard/internal/handlers"
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -34,12 +35,15 @@ func TestBulkResolve_MostRecentStrategy(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 2, result.Total) assert.Equal(t, 2, result.Total)
assert.Equal(t, 2, result.Success) assert.Equal(t, 2, result.Success)
@@ -73,12 +77,15 @@ func TestBulkResolve_HighestProgressStrategy(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Total) assert.Equal(t, 1, result.Total)
assert.Equal(t, 1, result.Success) assert.Equal(t, 1, result.Success)
@@ -106,12 +113,15 @@ func TestBulkResolve_ManualStrategy(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Total) assert.Equal(t, 1, result.Total)
assert.Equal(t, 1, result.Success) assert.Equal(t, 1, result.Success)
@@ -137,12 +147,15 @@ func TestBulkResolve_ManualStrategy_WithoutWinner(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Failed) assert.Equal(t, 1, result.Failed)
assert.Equal(t, "error", result.Results[0].Status) assert.Equal(t, "error", result.Results[0].Status)
@@ -169,12 +182,15 @@ func TestBulkResolve_ManualStrategy_InvalidWinner(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Failed) assert.Equal(t, 1, result.Failed)
assert.Contains(t, result.Results[0].Error, "invalid winning source") assert.Contains(t, result.Results[0].Error, "invalid winning source")
@@ -196,12 +212,15 @@ func TestBulkResolve_ConflictNotFound(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Total) assert.Equal(t, 1, result.Total)
assert.Equal(t, 0, result.Success) assert.Equal(t, 0, result.Success)
@@ -225,7 +244,9 @@ func TestBulkResolve_EmptyConflictIDs(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -246,12 +267,15 @@ func TestBulkResolve_InvalidConflictID(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 1, result.Failed) assert.Equal(t, 1, result.Failed)
assert.Contains(t, result.Results[0].Error, "invalid conflict ID") assert.Contains(t, result.Results[0].Error, "invalid conflict ID")
@@ -267,7 +291,9 @@ func TestBulkResolve_InvalidRequestBody(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -287,7 +313,9 @@ func TestBulkResolve_RequiresAuth(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
} }
@@ -313,12 +341,15 @@ func TestBulkDismiss_RealConflicts(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, float64(2), result["total"]) assert.Equal(t, float64(2), result["total"])
assert.Equal(t, float64(2), result["success"]) assert.Equal(t, float64(2), result["success"])
@@ -347,12 +378,15 @@ func TestBulkDismiss_NotFoundConflict(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, float64(1), result["total"]) assert.Equal(t, float64(1), result["total"])
assert.Equal(t, float64(0), result["success"]) assert.Equal(t, float64(0), result["success"])
@@ -374,12 +408,15 @@ func TestBulkDismiss_InvalidConflictID(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, float64(1), result["total"]) assert.Equal(t, float64(1), result["total"])
assert.Equal(t, float64(1), result["failed"]) assert.Equal(t, float64(1), result["failed"])
@@ -401,7 +438,9 @@ func TestBulkDismiss_EmptyConflictIDs(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -416,7 +455,9 @@ func TestBulkDismiss_InvalidRequestBody(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -435,7 +476,9 @@ func TestBulkDismiss_RequiresAuth(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
} }
@@ -459,12 +502,15 @@ func TestBulkResolve_MixedSuccessAndFailure(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result handlers.BulkResolveResponse var result handlers.BulkResolveResponse
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, 2, result.Total) assert.Equal(t, 2, result.Total)
assert.Equal(t, 1, result.Success) assert.Equal(t, 1, result.Success)
+30 -11
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -40,7 +41,9 @@ func (s *DashboardIntegrationTestSuite) TestGetSections_EndToEndFlow() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusOK, resp.StatusCode) assert.Equal(s.T(), http.StatusOK, resp.StatusCode)
@@ -87,7 +90,9 @@ func (s *DashboardIntegrationTestSuite) TestGetSections_MissingLibraryID() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode) assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode)
} }
@@ -101,7 +106,9 @@ func (s *DashboardIntegrationTestSuite) TestGetSections_InvalidLibraryID() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode) assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode)
} }
@@ -112,7 +119,9 @@ func (s *DashboardIntegrationTestSuite) TestGetSections_Unauthorized() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode) assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode)
} }
@@ -136,7 +145,9 @@ func (s *DashboardIntegrationTestSuite) TestUpdatePreferences_Success() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusOK, resp.StatusCode) assert.Equal(s.T(), http.StatusOK, resp.StatusCode)
@@ -164,7 +175,9 @@ func (s *DashboardIntegrationTestSuite) TestUpdatePreferences_Unauthorized() {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode) assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode)
} }
@@ -184,7 +197,9 @@ func (s *DashboardIntegrationTestSuite) TestRestoreSystemCollection_InvalidName(
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode) assert.Equal(s.T(), http.StatusBadRequest, resp.StatusCode)
} }
@@ -201,7 +216,9 @@ func (s *DashboardIntegrationTestSuite) TestRestoreSystemCollection_Unauthorized
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode) assert.Equal(s.T(), http.StatusUnauthorized, resp.StatusCode)
} }
@@ -224,14 +241,16 @@ func (s *DashboardIntegrationTestSuite) TestRestoreSystemCollection_ValidNames()
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(s.T(), err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err) require.NoError(s.T(), err)
assert.Contains(t, response, "message") assert.Contains(t, response, "message")
}) })
+45 -17
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings" "strings"
@@ -68,7 +69,9 @@ func TestUpdateUserMaxDevices(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, tt.expectedStatus, resp.StatusCode, "expected status code") assert.Equal(t, tt.expectedStatus, resp.StatusCode, "expected status code")
@@ -134,7 +137,9 @@ func TestUpdateUserMaxDevicesValidation(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, tt.expectedStatus, resp.StatusCode, "expected validation error") assert.Equal(t, tt.expectedStatus, resp.StatusCode, "expected validation error")
}) })
@@ -166,7 +171,9 @@ func TestUpdateUserMaxDevicesAuth(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -190,7 +197,9 @@ func TestUpdateUserMaxDevicesAuth(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusForbidden, resp.StatusCode) assert.Equal(t, http.StatusForbidden, resp.StatusCode)
}) })
@@ -221,7 +230,9 @@ func TestUpdateUserMaxDevicesNonExistentUser(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 500 or 404 depending on implementation // Should return 500 or 404 depending on implementation
assert.True(t, resp.StatusCode == http.StatusInternalServerError || resp.StatusCode == http.StatusNotFound) assert.True(t, resp.StatusCode == http.StatusInternalServerError || resp.StatusCode == http.StatusNotFound)
@@ -250,7 +261,9 @@ func TestUpdateUserMaxDevicesMissingUserID(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -271,12 +284,15 @@ func TestListUsersIncludesMaxDevices(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var users []map[string]interface{} var users []map[string]interface{}
json.NewDecoder(resp.Body).Decode(&users) err = json.NewDecoder(resp.Body).Decode(&users)
require.NoError(t, err)
// Verify max_devices and device_count fields are present in response // Verify max_devices and device_count fields are present in response
if len(users) > 0 { if len(users) > 0 {
@@ -306,7 +322,7 @@ func createAdminUser(t *testing.T, ts *httptest.Server, token string) {
client := &http.Client{} client := &http.Client{}
resp, _ := client.Do(req) resp, _ := client.Do(req)
resp.Body.Close() _ = resp.Body.Close()
} }
// Helper function to create test user for max devices tests // Helper function to create test user for max devices tests
@@ -327,7 +343,9 @@ func createTestUserForMaxDevices(t *testing.T, ts *httptest.Server, adminToken s
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Check if user creation succeeded or already exists (409 Conflict) // Check if user creation succeeded or already exists (409 Conflict)
if resp.StatusCode == http.StatusConflict { if resp.StatusCode == http.StatusConflict {
@@ -343,10 +361,13 @@ func createTestUserForMaxDevices(t *testing.T, ts *httptest.Server, adminToken s
loginResp, err := client.Do(loginReq) loginResp, err := client.Do(loginReq)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
// Extract user_id from JWT or response // Extract user_id from JWT or response
// The access_token contains the user ID in the JWT claims // The access_token contains the user ID in the JWT claims
@@ -392,7 +413,8 @@ func createTestUserForMaxDevices(t *testing.T, ts *httptest.Server, adminToken s
} }
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
// Check if user creation was successful // Check if user creation was successful
if result["user"] == nil { if result["user"] == nil {
@@ -422,10 +444,13 @@ func getAdminToken(t *testing.T, ts *httptest.Server, userID uuid.UUID) string {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
// Safe type assertion with check // Safe type assertion with check
if accessToken, ok := result["access_token"].(string); ok { if accessToken, ok := result["access_token"].(string); ok {
@@ -450,10 +475,13 @@ func loginTestUserByCredentials(t *testing.T, ts *httptest.Server, email, passwo
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
// Safe type assertion with check // Safe type assertion with check
if accessToken, ok := result["access_token"].(string); ok { if accessToken, ok := result["access_token"].(string); ok {
+65 -27
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -19,7 +20,9 @@ func TestSavedFilters(t *testing.T) {
httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters?resource_type=media-items", nil) httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters?resource_type=media-items", nil)
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -30,12 +33,15 @@ func TestSavedFilters(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var filters []map[string]interface{} var filters []map[string]interface{}
json.NewDecoder(resp.Body).Decode(&filters) err = json.NewDecoder(resp.Body).Decode(&filters)
require.NoError(t, err)
assert.Equal(t, 0, len(filters)) assert.Equal(t, 0, len(filters))
}) })
@@ -56,12 +62,15 @@ func TestSavedFilters(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
var filter map[string]interface{} var filter map[string]interface{}
json.NewDecoder(resp.Body).Decode(&filter) err = json.NewDecoder(resp.Body).Decode(&filter)
require.NoError(t, err)
assert.Equal(t, "My Sci-Fi Books", filter["name"]) assert.Equal(t, "My Sci-Fi Books", filter["name"])
assert.Equal(t, "media-items", filter["resource_type"]) assert.Equal(t, "media-items", filter["resource_type"])
assert.NotEmpty(t, filter["id"]) assert.NotEmpty(t, filter["id"])
@@ -84,7 +93,7 @@ func TestSavedFilters(t *testing.T) {
resp1, err := client.Do(httpReq1) resp1, err := client.Do(httpReq1)
require.NoError(t, err) require.NoError(t, err)
resp1.Body.Close() _ = resp1.Body.Close()
assert.Equal(t, http.StatusCreated, resp1.StatusCode) assert.Equal(t, http.StatusCreated, resp1.StatusCode)
@@ -96,7 +105,7 @@ func TestSavedFilters(t *testing.T) {
resp2, err := client.Do(httpReq2) resp2, err := client.Do(httpReq2)
require.NoError(t, err) require.NoError(t, err)
resp2.Body.Close() _ = resp2.Body.Close()
assert.Equal(t, http.StatusConflict, resp2.StatusCode) assert.Equal(t, http.StatusConflict, resp2.StatusCode)
}) })
@@ -116,12 +125,15 @@ func TestSavedFilters(t *testing.T) {
createResp, err := client.Do(createHTTP) createResp, err := client.Do(createHTTP)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
assert.Equal(t, http.StatusCreated, createResp.StatusCode) assert.Equal(t, http.StatusCreated, createResp.StatusCode)
var createdFilter map[string]interface{} var createdFilter map[string]interface{}
json.NewDecoder(createResp.Body).Decode(&createdFilter) err = json.NewDecoder(createResp.Body).Decode(&createdFilter)
require.NoError(t, err)
filterID := createdFilter["id"].(string) filterID := createdFilter["id"].(string)
// Update filter // Update filter
@@ -138,12 +150,15 @@ func TestSavedFilters(t *testing.T) {
updateResp, err := client.Do(updateHTTP) updateResp, err := client.Do(updateHTTP)
require.NoError(t, err) require.NoError(t, err)
defer updateResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(updateResp.Body)
assert.Equal(t, http.StatusOK, updateResp.StatusCode) assert.Equal(t, http.StatusOK, updateResp.StatusCode)
var updatedFilter map[string]interface{} var updatedFilter map[string]interface{}
json.NewDecoder(updateResp.Body).Decode(&updatedFilter) err = json.NewDecoder(updateResp.Body).Decode(&updatedFilter)
require.NoError(t, err)
assert.Equal(t, "Updated Name", updatedFilter["name"]) assert.Equal(t, "Updated Name", updatedFilter["name"])
}) })
@@ -162,10 +177,13 @@ func TestSavedFilters(t *testing.T) {
createResp, err := client.Do(createHTTP) createResp, err := client.Do(createHTTP)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
var createdFilter map[string]interface{} var createdFilter map[string]interface{}
json.NewDecoder(createResp.Body).Decode(&createdFilter) err = json.NewDecoder(createResp.Body).Decode(&createdFilter)
require.NoError(t, err)
filterID := createdFilter["id"].(string) filterID := createdFilter["id"].(string)
// Delete filter // Delete filter
@@ -174,7 +192,7 @@ func TestSavedFilters(t *testing.T) {
deleteResp, err := client.Do(deleteHTTP) deleteResp, err := client.Do(deleteHTTP)
require.NoError(t, err) require.NoError(t, err)
deleteResp.Body.Close() _ = deleteResp.Body.Close()
assert.Equal(t, http.StatusNoContent, deleteResp.StatusCode) assert.Equal(t, http.StatusNoContent, deleteResp.StatusCode)
}) })
@@ -198,10 +216,13 @@ func TestSavedFilters(t *testing.T) {
createResp, err := client.Do(createHTTP) createResp, err := client.Do(createHTTP)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
var createdFilter map[string]interface{} var createdFilter map[string]interface{}
json.NewDecoder(createResp.Body).Decode(&createdFilter) err = json.NewDecoder(createResp.Body).Decode(&createdFilter)
require.NoError(t, err)
filterID := createdFilter["id"].(string) filterID := createdFilter["id"].(string)
// Admin user tries to delete regular user's filter // Admin user tries to delete regular user's filter
@@ -210,7 +231,7 @@ func TestSavedFilters(t *testing.T) {
deleteResp, err := client.Do(deleteHTTP) deleteResp, err := client.Do(deleteHTTP)
require.NoError(t, err) require.NoError(t, err)
deleteResp.Body.Close() _ = deleteResp.Body.Close()
assert.Equal(t, http.StatusNotFound, deleteResp.StatusCode) assert.Equal(t, http.StatusNotFound, deleteResp.StatusCode)
}) })
@@ -230,12 +251,15 @@ func TestSavedFilters(t *testing.T) {
createResp, err := client.Do(createReq) createResp, err := client.Do(createReq)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
assert.Equal(t, http.StatusCreated, createResp.StatusCode) assert.Equal(t, http.StatusCreated, createResp.StatusCode)
var createdFilter map[string]interface{} var createdFilter map[string]interface{}
json.NewDecoder(createResp.Body).Decode(&createdFilter) err = json.NewDecoder(createResp.Body).Decode(&createdFilter)
require.NoError(t, err)
filterID := createdFilter["id"].(string) filterID := createdFilter["id"].(string)
// Now retrieve the filter by ID // Now retrieve the filter by ID
@@ -244,12 +268,15 @@ func TestSavedFilters(t *testing.T) {
getResp, err := client.Do(getReq) getResp, err := client.Do(getReq)
require.NoError(t, err) require.NoError(t, err)
defer getResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(getResp.Body)
assert.Equal(t, http.StatusOK, getResp.StatusCode) assert.Equal(t, http.StatusOK, getResp.StatusCode)
var retrievedFilter map[string]interface{} var retrievedFilter map[string]interface{}
json.NewDecoder(getResp.Body).Decode(&retrievedFilter) err = json.NewDecoder(getResp.Body).Decode(&retrievedFilter)
require.NoError(t, err)
assert.Equal(t, "Test Filter", retrievedFilter["name"]) assert.Equal(t, "Test Filter", retrievedFilter["name"])
assert.Equal(t, "media-items", retrievedFilter["resource_type"]) assert.Equal(t, "media-items", retrievedFilter["resource_type"])
assert.Equal(t, filterID, retrievedFilter["id"]) assert.Equal(t, filterID, retrievedFilter["id"])
@@ -260,7 +287,9 @@ func TestSavedFilters(t *testing.T) {
httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters/550e8400-e29b-41d4-a716-446655440000", nil) httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters/550e8400-e29b-41d4-a716-446655440000", nil)
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -271,7 +300,9 @@ func TestSavedFilters(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -283,7 +314,9 @@ func TestSavedFilters(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusNotFound, resp.StatusCode) assert.Equal(t, http.StatusNotFound, resp.StatusCode)
}) })
@@ -301,16 +334,21 @@ func TestSavedFilters(t *testing.T) {
createReq.Header.Set("Authorization", "Bearer "+setup.Token) createReq.Header.Set("Authorization", "Bearer "+setup.Token)
createResp, err := client.Do(createReq) createResp, err := client.Do(createReq)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
var createdFilter map[string]interface{} var createdFilter map[string]interface{}
json.NewDecoder(createResp.Body).Decode(&createdFilter) err = json.NewDecoder(createResp.Body).Decode(&createdFilter)
require.NoError(t, err)
filterID := createdFilter["id"].(string) filterID := createdFilter["id"].(string)
// Try to access with regular user (setup.RegularToken) // Try to access with regular user (setup.RegularToken)
httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters/"+filterID, nil) httpReq, _ := http.NewRequest("GET", setup.Server.URL+"/api/saved-filters/"+filterID, nil)
httpReq.Header.Set("Authorization", "Bearer "+setup.RegularToken) httpReq.Header.Set("Authorization", "Bearer "+setup.RegularToken)
getResp, err := client.Do(httpReq) getResp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer getResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(getResp.Body)
// Should return 404 (not 403 - hide existence) // Should return 404 (not 403 - hide existence)
assert.Equal(t, http.StatusNotFound, getResp.StatusCode) assert.Equal(t, http.StatusNotFound, getResp.StatusCode)
}) })
+24 -11
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
@@ -31,10 +32,13 @@ func TestFSNotify_BulkFileDetection(t *testing.T) {
client := &http.Client{} client := &http.Client{}
libResp, err := client.Do(libReq) libResp, err := client.Do(libReq)
require.NoError(t, err) require.NoError(t, err)
defer libResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(libResp.Body)
require.Equal(t, http.StatusCreated, libResp.StatusCode) require.Equal(t, http.StatusCreated, libResp.StatusCode)
var libResult map[string]interface{} var libResult map[string]interface{}
json.NewDecoder(libResp.Body).Decode(&libResult) err = json.NewDecoder(libResp.Body).Decode(&libResult)
require.NoError(t, err)
libraryID := libResult["id"].(string) libraryID := libResult["id"].(string)
// Add folder to library // Add folder to library
folderURL := fmt.Sprintf("%s/api/libraries/%s/folders", setup.Server.URL, libraryID) folderURL := fmt.Sprintf("%s/api/libraries/%s/folders", setup.Server.URL, libraryID)
@@ -47,7 +51,9 @@ func TestFSNotify_BulkFileDetection(t *testing.T) {
folderHTTPReq.Header.Set("Authorization", "Bearer "+token) folderHTTPReq.Header.Set("Authorization", "Bearer "+token)
folderResp, err := client.Do(folderHTTPReq) folderResp, err := client.Do(folderHTTPReq)
require.NoError(t, err) require.NoError(t, err)
defer folderResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(folderResp.Body)
require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Folder should be added to library") require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Folder should be added to library")
// Create 20 test files simultaneously // Create 20 test files simultaneously
for i := 0; i < 20; i++ { for i := 0; i < 20; i++ {
@@ -61,10 +67,13 @@ func TestFSNotify_BulkFileDetection(t *testing.T) {
scanHTTPReq.Header.Set("Authorization", "Bearer "+token) scanHTTPReq.Header.Set("Authorization", "Bearer "+token)
scanResp, err := client.Do(scanHTTPReq) scanResp, err := client.Do(scanHTTPReq)
require.NoError(t, err) require.NoError(t, err)
defer scanResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(scanResp.Body)
require.Equal(t, http.StatusAccepted, scanResp.StatusCode, "Scan should be accepted") require.Equal(t, http.StatusAccepted, scanResp.StatusCode, "Scan should be accepted")
var scanResponse map[string]interface{} var scanResponse map[string]interface{}
json.NewDecoder(scanResp.Body).Decode(&scanResponse) err = json.NewDecoder(scanResp.Body).Decode(&scanResponse)
require.NoError(t, err)
jobID, ok := scanResponse["job_id"].(string) jobID, ok := scanResponse["job_id"].(string)
require.True(t, ok, "job_id should be string") require.True(t, ok, "job_id should be string")
require.NotEmpty(t, jobID, "job_id should not be empty") require.NotEmpty(t, jobID, "job_id should not be empty")
@@ -81,16 +90,17 @@ func TestFSNotify_BulkFileDetection(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
if statusResp.StatusCode == http.StatusNotFound { if statusResp.StatusCode == http.StatusNotFound {
statusResp.Body.Close() _ = statusResp.Body.Close()
break // Job completed break // Job completed
} }
var status map[string]interface{} var status map[string]interface{}
json.NewDecoder(statusResp.Body).Decode(&status) err = json.NewDecoder(statusResp.Body).Decode(&status)
statusResp.Body.Close() require.NoError(t, err)
_ = statusResp.Body.Close()
if status["status"] == "completed" || status["status"] == "failed" { if status["status"] == "completed" || status["status"] == "failed" {
statusResp.Body.Close() _ = statusResp.Body.Close()
break break
} }
} }
@@ -99,9 +109,12 @@ func TestFSNotify_BulkFileDetection(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Authorization", "Bearer "+token)
itemsResp, err := client.Do(req) itemsResp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer itemsResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(itemsResp.Body)
var itemsResult map[string]interface{} var itemsResult map[string]interface{}
json.NewDecoder(itemsResp.Body).Decode(&itemsResult) err = json.NewDecoder(itemsResp.Body).Decode(&itemsResult)
require.NoError(t, err)
items, ok := itemsResult["data"].([]interface{}) items, ok := itemsResult["data"].([]interface{})
if !ok || items == nil { if !ok || items == nil {
items = []interface{}{} // Handle nil or wrong type items = []interface{}{} // Handle nil or wrong type
+26 -9
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"testing" "testing"
"time" "time"
@@ -33,7 +34,9 @@ func TestJobsHandler_CreateJob(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusAccepted, resp.StatusCode) require.Equal(t, http.StatusAccepted, resp.StatusCode)
@@ -65,7 +68,9 @@ func TestJobsHandler_CreateJob_InvalidType(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusBadRequest, resp.StatusCode) require.Equal(t, http.StatusBadRequest, resp.StatusCode)
} }
@@ -88,7 +93,9 @@ func TestJobsHandler_GetJobStatus(t *testing.T) {
client := &http.Client{} client := &http.Client{}
createResp, err := client.Do(createReq) createResp, err := client.Do(createReq)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
var createResponse map[string]interface{} var createResponse map[string]interface{}
err = json.NewDecoder(createResp.Body).Decode(&createResponse) err = json.NewDecoder(createResp.Body).Decode(&createResponse)
@@ -103,7 +110,9 @@ func TestJobsHandler_GetJobStatus(t *testing.T) {
getResp, err := client.Do(getReq) getResp, err := client.Do(getReq)
require.NoError(t, err) require.NoError(t, err)
defer getResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(getResp.Body)
require.Equal(t, http.StatusOK, getResp.StatusCode) require.Equal(t, http.StatusOK, getResp.StatusCode)
@@ -128,7 +137,9 @@ func TestJobsHandler_GetJobStatus_NotFound(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusNotFound, resp.StatusCode) require.Equal(t, http.StatusNotFound, resp.StatusCode)
} }
@@ -151,7 +162,9 @@ func TestJobsHandler_CreateAndTrackJob(t *testing.T) {
client := &http.Client{} client := &http.Client{}
createResp, err := client.Do(createReq) createResp, err := client.Do(createReq)
require.NoError(t, err) require.NoError(t, err)
defer createResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(createResp.Body)
var createResponse map[string]interface{} var createResponse map[string]interface{}
err = json.NewDecoder(createResp.Body).Decode(&createResponse) err = json.NewDecoder(createResp.Body).Decode(&createResponse)
@@ -172,7 +185,7 @@ func TestJobsHandler_CreateAndTrackJob(t *testing.T) {
var statusResponse map[string]interface{} var statusResponse map[string]interface{}
err = json.NewDecoder(getResp.Body).Decode(&statusResponse) err = json.NewDecoder(getResp.Body).Decode(&statusResponse)
getResp.Body.Close() _ = getResp.Body.Close()
require.NoError(t, err) require.NoError(t, err)
if statusResponse["status"] != nil { if statusResponse["status"] != nil {
@@ -202,7 +215,9 @@ func TestJobsHandler_CreateJob_Unauthorized(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusUnauthorized, resp.StatusCode) require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
} }
@@ -218,7 +233,9 @@ func TestJobsHandler_GetJobStatus_Unauthorized(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusUnauthorized, resp.StatusCode) require.Equal(t, http.StatusUnauthorized, resp.StatusCode)
} }
+22 -8
View File
@@ -5,6 +5,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"log" "log"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@@ -37,7 +38,9 @@ func TestKoboInitialization(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
}) })
@@ -65,7 +68,9 @@ func TestKoboLibrarySync(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
}) })
@@ -129,11 +134,14 @@ func TestKoboMarkupSync(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "Status") assert.Contains(t, result, "Status")
}) })
} }
@@ -182,11 +190,14 @@ func TestKoboBookmarkSync(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "Status") assert.Contains(t, result, "Status")
}) })
} }
@@ -224,11 +235,14 @@ func TestKoboAnalyticsGettests(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "Status") assert.Contains(t, result, "Status")
}) })
} }
+49 -18
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"context" "context"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -31,7 +32,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
@@ -58,7 +61,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -76,12 +81,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -106,12 +114,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Equal(t, 3.0, result["total"]) assert.Equal(t, 3.0, result["total"])
@@ -130,7 +141,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -154,7 +167,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
}) })
@@ -179,7 +194,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -204,12 +221,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -246,12 +266,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Equal(t, 2.0, result["total"]) assert.Equal(t, 2.0, result["total"])
@@ -304,12 +327,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
assert.Contains(t, result, "total") assert.Contains(t, result, "total")
@@ -352,12 +378,15 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Contains(t, result, "results") assert.Contains(t, result, "results")
}) })
@@ -371,7 +400,9 @@ func TestMediaBulkOperations(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
+58 -23
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
@@ -31,12 +32,15 @@ func createTestLibrary(t *testing.T, ts *httptest.Server, token, name string) st
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
return result["id"].(string) return result["id"].(string)
} }
@@ -164,7 +168,9 @@ func TestMediaItemISBNNormalization(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Check if this is an invalid ISBN case that should return 422 // Check if this is an invalid ISBN case that should return 422
if tc.expected == "" && (tc.input == "---" || tc.input == " ") { if tc.expected == "" && (tc.input == "---" || tc.input == " ") {
@@ -174,7 +180,8 @@ func TestMediaItemISBNNormalization(t *testing.T) {
} }
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
// For valid ISBN responses, verify normalization worked correctly // For valid ISBN responses, verify normalization worked correctly
if resp.StatusCode == http.StatusCreated { if resp.StatusCode == http.StatusCreated {
@@ -209,7 +216,9 @@ func TestMediaItemISBNEdgeCases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
}) })
@@ -232,10 +241,13 @@ func TestMediaItemISBNEdgeCases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
assert.Equal(t, "9780306406157", response["isbn"]) assert.Equal(t, "9780306406157", response["isbn"])
@@ -259,10 +271,13 @@ func TestMediaItemISBNEdgeCases(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
assert.Equal(t, "9780596009652", response["isbn"]) assert.Equal(t, "9780596009652", response["isbn"])
@@ -296,7 +311,7 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
resp.Body.Close() _ = resp.Body.Close()
} }
// Small delay to allow database to commit before pagination queries // Small delay to allow database to commit before pagination queries
@@ -309,12 +324,15 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
data := response["data"].([]interface{}) data := response["data"].([]interface{})
// Should get 2 items // Should get 2 items
@@ -328,12 +346,15 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
data := response["data"].([]interface{}) data := response["data"].([]interface{})
// Should get 2 items starting from offset 2 // Should get 2 items starting from offset 2
@@ -347,7 +368,9 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 400 Bad Request or handle it gracefully // Should return 400 Bad Request or handle it gracefully
assert.NotEqual(t, http.StatusOK, resp.StatusCode) assert.NotEqual(t, http.StatusOK, resp.StatusCode)
@@ -360,7 +383,9 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 400 Bad Request or handle it gracefully // Should return 400 Bad Request or handle it gracefully
assert.NotEqual(t, http.StatusOK, resp.StatusCode) assert.NotEqual(t, http.StatusOK, resp.StatusCode)
@@ -373,7 +398,9 @@ func TestMediaItemsPagination(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should be capped at maximum or return error // Should be capped at maximum or return error
// The application uses maxPaginationLimit = 1000 // The application uses maxPaginationLimit = 1000
@@ -404,7 +431,9 @@ func TestMediaItemLibraryRequirement(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should fail - library_id is required // Should fail - library_id is required
assert.NotEqual(t, http.StatusCreated, resp.StatusCode) assert.NotEqual(t, http.StatusCreated, resp.StatusCode)
@@ -431,12 +460,15 @@ func TestMediaItemLibraryRequirement(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
require.NoError(t, err)
// VerifyISBN was normalized // VerifyISBN was normalized
assert.Equal(t, "9780306406157", response["isbn"]) assert.Equal(t, "9780306406157", response["isbn"])
@@ -472,8 +504,9 @@ func TestUpdateMediaItemISBN(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
var createResponse map[string]interface{} var createResponse map[string]interface{}
json.NewDecoder(resp.Body).Decode(&createResponse) err = json.NewDecoder(resp.Body).Decode(&createResponse)
resp.Body.Close() require.NoError(t, err)
_ = resp.Body.Close()
mediaItemID := createResponse["id"].(string) mediaItemID := createResponse["id"].(string)
@@ -491,7 +524,9 @@ func TestUpdateMediaItemISBN(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusUnprocessableEntity, resp.StatusCode) assert.Equal(t, http.StatusUnprocessableEntity, resp.StatusCode)
}) })
+69 -23
View File
@@ -26,7 +26,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// OPDS endpoints require device authentication via devices.auth_token // OPDS endpoints require device authentication via devices.auth_token
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode) assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
@@ -37,7 +39,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 400 for invalid UUID // Should return 400 for invalid UUID
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
@@ -53,7 +57,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 200 with catalog (even if empty) // Should return 200 with catalog (even if empty)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -69,7 +75,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 200 with catalog (even if empty) // Should return 200 with catalog (even if empty)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -80,7 +88,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -95,7 +105,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return 200 (even if empty results) // Should return 200 (even if empty results)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -106,7 +118,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -120,7 +134,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return navigation or 404 // Should return navigation or 404
assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNotFound) assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNotFound)
@@ -131,7 +147,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -142,7 +160,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -156,7 +176,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// May return 404 if device/book not linked, or 500 for file not found // May return 404 if device/book not linked, or 500 for file not found
// Should not return 400 (invalid IDs) // Should not return 400 (invalid IDs)
@@ -168,7 +190,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -178,7 +202,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -192,7 +218,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// May return 404 if no cover, but not 400 // May return 404 if no cover, but not 400
assert.NotEqual(t, http.StatusBadRequest, resp.StatusCode) assert.NotEqual(t, http.StatusBadRequest, resp.StatusCode)
@@ -204,7 +232,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -218,7 +248,9 @@ func TestOPDSEndpoints(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return formats list or 404 // Should return formats list or 404
assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNotFound) assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusNotFound)
@@ -245,7 +277,9 @@ func TestOPDSConversion(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should attempt conversion (may fail if file doesn't exist) // Should attempt conversion (may fail if file doesn't exist)
// Important: Should not return 400 for invalid IDs // Important: Should not return 400 for invalid IDs
@@ -262,7 +296,9 @@ func TestOPDSConversion(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should attempt to download original format // Should attempt to download original format
assert.NotEqual(t, http.StatusBadRequest, resp.StatusCode) assert.NotEqual(t, http.StatusBadRequest, resp.StatusCode)
@@ -278,7 +314,9 @@ func TestOPDSConversion(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should handle gracefully (either 400 for unsupported format or 404/500) // Should handle gracefully (either 400 for unsupported format or 404/500)
assert.True(t, resp.StatusCode >= 400 && resp.StatusCode < 600) assert.True(t, resp.StatusCode >= 400 && resp.StatusCode < 600)
@@ -300,7 +338,9 @@ func TestOPDSEdgeCases(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should return empty catalog, not error // Should return empty catalog, not error
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -316,7 +356,9 @@ func TestOPDSEdgeCases(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should handle special characters // Should handle special characters
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -331,7 +373,9 @@ func TestOPDSEdgeCases(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should handle empty query // Should handle empty query
assert.True(t, resp.StatusCode >= 200 && resp.StatusCode < 500) assert.True(t, resp.StatusCode >= 200 && resp.StatusCode < 500)
@@ -371,7 +415,9 @@ func TestOPDSSearchAcrossLibraries(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
t.Logf("OPDS Search Status: %d", resp.StatusCode) t.Logf("OPDS Search Status: %d", resp.StatusCode)
+4 -2
View File
@@ -388,7 +388,8 @@ func TestProcessingIssuesCrossLibraryIsolation(t *testing.T) {
setup.Server.Config.Handler.ServeHTTP(rec1, req1) setup.Server.Config.Handler.ServeHTTP(rec1, req1)
var stats1 map[string]interface{} var stats1 map[string]interface{}
json.NewDecoder(rec1.Body).Decode(&stats1) err := json.NewDecoder(rec1.Body).Decode(&stats1)
require.NoError(t, err)
// Get stats for library 2 // Get stats for library 2
req2 := httptest.NewRequest("GET", "/api/libraries/"+library2ID+"/issues/stats", nil) req2 := httptest.NewRequest("GET", "/api/libraries/"+library2ID+"/issues/stats", nil)
@@ -398,7 +399,8 @@ func TestProcessingIssuesCrossLibraryIsolation(t *testing.T) {
setup.Server.Config.Handler.ServeHTTP(rec2, req2) setup.Server.Config.Handler.ServeHTTP(rec2, req2)
var stats2 map[string]interface{} var stats2 map[string]interface{}
json.NewDecoder(rec2.Body).Decode(&stats2) err = json.NewDecoder(rec2.Body).Decode(&stats2)
require.NoError(t, err)
// Both should have zero counts // Both should have zero counts
assert.Equal(t, float64(0), stats1["error_count"]) assert.Equal(t, float64(0), stats1["error_count"])
+60 -22
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"testing" "testing"
@@ -24,7 +25,9 @@ func TestRefreshTokenFlow(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -40,7 +43,9 @@ func TestRefreshTokenFlow(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -58,12 +63,15 @@ func TestRefreshTokenFlow(t *testing.T) {
loginResp, err := client.Do(loginHTTP) loginResp, err := client.Do(loginHTTP)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
require.Equal(t, http.StatusOK, loginResp.StatusCode) require.Equal(t, http.StatusOK, loginResp.StatusCode)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
refreshToken, ok := loginResult["refresh_token"].(string) refreshToken, ok := loginResult["refresh_token"].(string)
require.True(t, ok, "Should have refresh_token") require.True(t, ok, "Should have refresh_token")
@@ -79,12 +87,15 @@ func TestRefreshTokenFlow(t *testing.T) {
refreshResp, err := client.Do(refreshHTTP) refreshResp, err := client.Do(refreshHTTP)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp.Body)
assert.Equal(t, http.StatusOK, refreshResp.StatusCode) assert.Equal(t, http.StatusOK, refreshResp.StatusCode)
var refreshResult map[string]interface{} var refreshResult map[string]interface{}
json.NewDecoder(refreshResp.Body).Decode(&refreshResult) err = json.NewDecoder(refreshResp.Body).Decode(&refreshResult)
require.NoError(t, err)
assert.Contains(t, refreshResult, "access_token") assert.Contains(t, refreshResult, "access_token")
assert.NotEmpty(t, refreshResult["access_token"], "New access token should not be empty") assert.NotEmpty(t, refreshResult["access_token"], "New access token should not be empty")
@@ -102,7 +113,9 @@ func TestRefreshTokenFlow(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -118,7 +131,9 @@ func TestRefreshTokenFlow(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Should still work or return appropriate error // Should still work or return appropriate error
assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusBadRequest || resp.StatusCode == http.StatusUnsupportedMediaType) assert.True(t, resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusBadRequest || resp.StatusCode == http.StatusUnsupportedMediaType)
@@ -143,12 +158,15 @@ func TestRefreshTokenSecurity(t *testing.T) {
loginResp, err := client.Do(loginHTTP) loginResp, err := client.Do(loginHTTP)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
require.Equal(t, http.StatusOK, loginResp.StatusCode) require.Equal(t, http.StatusOK, loginResp.StatusCode)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
refreshToken := loginResult["refresh_token"].(string) refreshToken := loginResult["refresh_token"].(string)
@@ -163,7 +181,9 @@ func TestRefreshTokenSecurity(t *testing.T) {
refreshResp1, err := client.Do(refreshHTTP1) refreshResp1, err := client.Do(refreshHTTP1)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp1.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp1.Body)
assert.Equal(t, http.StatusOK, refreshResp1.StatusCode) assert.Equal(t, http.StatusOK, refreshResp1.StatusCode)
@@ -173,7 +193,9 @@ func TestRefreshTokenSecurity(t *testing.T) {
refreshResp2, err := client.Do(refreshHTTP2) refreshResp2, err := client.Do(refreshHTTP2)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp2.Body)
// May return 401 if token reuse is detected, or 200 if not implemented // May return 401 if token reuse is detected, or 200 if not implemented
// Either is acceptable depending on security requirements // Either is acceptable depending on security requirements
@@ -197,7 +219,9 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -213,7 +237,9 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
resp, err := client.Do(httpReq) resp, err := client.Do(httpReq)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}) })
@@ -231,12 +257,15 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
loginResp, err := client.Do(loginHTTP) loginResp, err := client.Do(loginHTTP)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
require.Equal(t, http.StatusOK, loginResp.StatusCode) require.Equal(t, http.StatusOK, loginResp.StatusCode)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
refreshToken := loginResult["refresh_token"].(string) refreshToken := loginResult["refresh_token"].(string)
@@ -251,12 +280,15 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
refreshResp, err := client.Do(refreshHTTP) refreshResp, err := client.Do(refreshHTTP)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp.Body)
require.Equal(t, http.StatusOK, refreshResp.StatusCode) require.Equal(t, http.StatusOK, refreshResp.StatusCode)
var refreshResult map[string]interface{} var refreshResult map[string]interface{}
json.NewDecoder(refreshResp.Body).Decode(&refreshResult) err = json.NewDecoder(refreshResp.Body).Decode(&refreshResult)
require.NoError(t, err)
// Verify response structure // Verify response structure
assert.Contains(t, refreshResult, "access_token") assert.Contains(t, refreshResult, "access_token")
@@ -279,12 +311,15 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
loginResp, err := client.Do(loginHTTP) loginResp, err := client.Do(loginHTTP)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
require.Equal(t, http.StatusOK, loginResp.StatusCode) require.Equal(t, http.StatusOK, loginResp.StatusCode)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
refreshToken := loginResult["refresh_token"].(string) refreshToken := loginResult["refresh_token"].(string)
@@ -299,12 +334,15 @@ func TestRefreshTokenEdgeCases(t *testing.T) {
refreshResp, err := client.Do(refreshHTTP) refreshResp, err := client.Do(refreshHTTP)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp.Body)
require.Equal(t, http.StatusOK, refreshResp.StatusCode) require.Equal(t, http.StatusOK, refreshResp.StatusCode)
var refreshResult map[string]interface{} var refreshResult map[string]interface{}
json.NewDecoder(refreshResp.Body).Decode(&refreshResult) err = json.NewDecoder(refreshResp.Body).Decode(&refreshResult)
require.NoError(t, err)
// Verify access token is a string // Verify access token is a string
accessToken, ok := refreshResult["access_token"].(string) accessToken, ok := refreshResult["access_token"].(string)
@@ -25,8 +25,9 @@ func TestScanSettings_GetSettings(t *testing.T) {
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
resp.Body.Close() require.NoError(t, err)
_ = resp.Body.Close()
assert.Contains(t, response, "scan_poll_interval_seconds") assert.Contains(t, response, "scan_poll_interval_seconds")
assert.Contains(t, response, "auto_scan_enabled") assert.Contains(t, response, "auto_scan_enabled")
@@ -63,8 +64,9 @@ func TestScanSettings_UpdateSettings(t *testing.T) {
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
resp.Body.Close() require.NoError(t, err)
_ = resp.Body.Close()
assert.Equal(t, float64(45), response["scan_poll_interval_seconds"]) assert.Equal(t, float64(45), response["scan_poll_interval_seconds"])
assert.Equal(t, true, response["auto_scan_enabled"]) assert.Equal(t, true, response["auto_scan_enabled"])
@@ -74,8 +76,9 @@ func TestScanSettings_UpdateSettings(t *testing.T) {
getResp, _ := client.Do(getReq) getResp, _ := client.Do(getReq)
var getResponse map[string]interface{} var getResponse map[string]interface{}
json.NewDecoder(getResp.Body).Decode(&getResponse) err = json.NewDecoder(getResp.Body).Decode(&getResponse)
getResp.Body.Close() require.NoError(t, err)
_ = getResp.Body.Close()
assert.Equal(t, float64(45), getResponse["scan_poll_interval_seconds"]) assert.Equal(t, float64(45), getResponse["scan_poll_interval_seconds"])
}) })
@@ -99,8 +102,9 @@ func TestScanSettings_UpdateSettings(t *testing.T) {
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var response map[string]interface{} var response map[string]interface{}
json.NewDecoder(resp.Body).Decode(&response) err = json.NewDecoder(resp.Body).Decode(&response)
resp.Body.Close() require.NoError(t, err)
_ = resp.Body.Close()
assert.Equal(t, false, response["auto_scan_enabled"]) assert.Equal(t, false, response["auto_scan_enabled"])
}) })
+16 -13
View File
@@ -46,8 +46,9 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_TracksStatistics() {
require.Equal(s.T(), http.StatusCreated, createLibResp.StatusCode) require.Equal(s.T(), http.StatusCreated, createLibResp.StatusCode)
var createLibResponse map[string]interface{} var createLibResponse map[string]interface{}
json.NewDecoder(createLibResp.Body).Decode(&createLibResponse) err = json.NewDecoder(createLibResp.Body).Decode(&createLibResponse)
createLibResp.Body.Close() require.NoError(s.T(), err)
_ = createLibResp.Body.Close()
libraryID, ok := createLibResponse["id"].(string) libraryID, ok := createLibResponse["id"].(string)
require.True(s.T(), ok, "library_id should be string") require.True(s.T(), ok, "library_id should be string")
@@ -64,7 +65,7 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_TracksStatistics() {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
resp.Body.Close() _ = resp.Body.Close()
require.Equal(s.T(), http.StatusCreated, resp.StatusCode, "Folder creation should succeed") require.Equal(s.T(), http.StatusCreated, resp.StatusCode, "Folder creation should succeed")
scanURL := fmt.Sprintf("%s/api/libraries/%s/scan", s.setup.Server.URL, libraryID) scanURL := fmt.Sprintf("%s/api/libraries/%s/scan", s.setup.Server.URL, libraryID)
@@ -78,7 +79,7 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_TracksStatistics() {
var scanResponse map[string]interface{} var scanResponse map[string]interface{}
err = json.NewDecoder(scanResp.Body).Decode(&scanResponse) err = json.NewDecoder(scanResp.Body).Decode(&scanResponse)
require.NoError(s.T(), err) require.NoError(s.T(), err)
scanResp.Body.Close() _ = scanResp.Body.Close()
jobID, ok := scanResponse["job_id"].(string) jobID, ok := scanResponse["job_id"].(string)
require.True(s.T(), ok, "job_id should be string") require.True(s.T(), ok, "job_id should be string")
@@ -104,7 +105,7 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_TracksStatistics() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
if statusResp.StatusCode == http.StatusNotFound { if statusResp.StatusCode == http.StatusNotFound {
statusResp.Body.Close() _ = statusResp.Body.Close()
if gotProgressUpdate { if gotProgressUpdate {
break break
} }
@@ -113,7 +114,7 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_TracksStatistics() {
var status map[string]interface{} var status map[string]interface{}
err = json.NewDecoder(statusResp.Body).Decode(&status) err = json.NewDecoder(statusResp.Body).Decode(&status)
statusResp.Body.Close() _ = statusResp.Body.Close()
require.NoError(s.T(), err) require.NoError(s.T(), err)
if _, hasError := status["error"]; hasError { if _, hasError := status["error"]; hasError {
@@ -180,8 +181,9 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_BatchingWorks() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
var createLibResponse map[string]interface{} var createLibResponse map[string]interface{}
json.NewDecoder(createLibResp.Body).Decode(&createLibResponse) err = json.NewDecoder(createLibResp.Body).Decode(&createLibResponse)
createLibResp.Body.Close() require.NoError(s.T(), err)
_ = createLibResp.Body.Close()
libraryID, ok := createLibResponse["id"].(string) libraryID, ok := createLibResponse["id"].(string)
require.True(s.T(), ok, "library_id should be string") require.True(s.T(), ok, "library_id should be string")
@@ -198,7 +200,7 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_BatchingWorks() {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(s.T(), err) require.NoError(s.T(), err)
resp.Body.Close() _ = resp.Body.Close()
scanURL := fmt.Sprintf("%s/api/libraries/%s/scan", s.setup.Server.URL, libraryID) scanURL := fmt.Sprintf("%s/api/libraries/%s/scan", s.setup.Server.URL, libraryID)
scanReq, _ := http.NewRequest("POST", scanURL, nil) scanReq, _ := http.NewRequest("POST", scanURL, nil)
@@ -208,8 +210,9 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_BatchingWorks() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
var scanResponse map[string]interface{} var scanResponse map[string]interface{}
json.NewDecoder(scanResp.Body).Decode(&scanResponse) err = json.NewDecoder(scanResp.Body).Decode(&scanResponse)
scanResp.Body.Close() require.NoError(s.T(), err)
_ = scanResp.Body.Close()
jobID, ok := scanResponse["job_id"].(string) jobID, ok := scanResponse["job_id"].(string)
require.True(s.T(), ok, "job_id should be string") require.True(s.T(), ok, "job_id should be string")
@@ -231,14 +234,14 @@ func (s *ScannerIntegrationTestSuite) TestScanProgress_BatchingWorks() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
if statusResp.StatusCode == http.StatusNotFound { if statusResp.StatusCode == http.StatusNotFound {
statusResp.Body.Close() _ = statusResp.Body.Close()
break break
} }
var status map[string]interface{} var status map[string]interface{}
err = json.NewDecoder(statusResp.Body).Decode(&status) err = json.NewDecoder(statusResp.Body).Decode(&status)
require.NoError(s.T(), err) require.NoError(s.T(), err)
statusResp.Body.Close() _ = statusResp.Body.Close()
if _, hasError := status["error"]; hasError { if _, hasError := status["error"]; hasError {
continue continue
+15 -6
View File
@@ -431,7 +431,9 @@ func TestCollectionSearchLibraryFilter(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Log response for debugging // Log response for debugging
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
@@ -440,7 +442,8 @@ func TestCollectionSearchLibraryFilter(t *testing.T) {
} }
var result []map[string]interface{} var result []map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
if tt.expectedCount > 0 { if tt.expectedCount > 0 {
require.Equal(t, http.StatusOK, resp.StatusCode) require.Equal(t, http.StatusOK, resp.StatusCode)
@@ -483,11 +486,14 @@ func createLibrary(t *testing.T, client *http.Client, setup *TestServerSetup, na
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
return result return result
} }
@@ -509,10 +515,13 @@ func createTestMediaItemIDInLibrary(t *testing.T, client *http.Client, setup *Te
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
return result["id"].(string) return result["id"].(string)
} }
+5 -2
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
@@ -30,7 +31,7 @@ func TestUnifiedSearch(t *testing.T) {
folderHTTP.Header.Set("Authorization", "Bearer "+setup.UserToken) folderHTTP.Header.Set("Authorization", "Bearer "+setup.UserToken)
folderResp, err := client.Do(folderHTTP) folderResp, err := client.Do(folderHTTP)
require.NoError(t, err) require.NoError(t, err)
folderResp.Body.Close() _ = folderResp.Body.Close()
require.Equal(t, http.StatusCreated, folderResp.StatusCode) require.Equal(t, http.StatusCreated, folderResp.StatusCode)
// Helper to create book with fields // Helper to create book with fields
@@ -54,7 +55,9 @@ func TestUnifiedSearch(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.UserToken) req.Header.Set("Authorization", "Bearer "+setup.UserToken)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
} }
+48 -19
View File
@@ -12,6 +12,7 @@ import (
"time" "time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
const baseTestURL = "http://localhost:8765/api" const baseTestURL = "http://localhost:8765/api"
@@ -36,12 +37,15 @@ func TestFullApplicationSetup(t *testing.T) {
t.Logf("Cleanup: No existing test user to delete (server not available)") t.Logf("Cleanup: No existing test user to delete (server not available)")
return return
} }
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// If login succeeds, try to delete the user // If login succeeds, try to delete the user
if resp.StatusCode == http.StatusOK { if resp.StatusCode == http.StatusOK {
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
if token, ok := result["access_token"].(string); ok && token != "" { if token, ok := result["access_token"].(string); ok && token != "" {
// Delete the user using the token // Delete the user using the token
@@ -52,7 +56,9 @@ func TestFullApplicationSetup(t *testing.T) {
client := &http.Client{} client := &http.Client{}
delResp, err := client.Do(req) delResp, err := client.Do(req)
if err == nil { if err == nil {
defer delResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(delResp.Body)
if delResp.StatusCode == http.StatusNoContent { if delResp.StatusCode == http.StatusNoContent {
t.Logf("Cleanup: Deleted existing test user") t.Logf("Cleanup: Deleted existing test user")
} else { } else {
@@ -66,10 +72,13 @@ func TestFullApplicationSetup(t *testing.T) {
listResp, err := client.Do(req) listResp, err := client.Do(req)
if err == nil { if err == nil {
defer listResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(listResp.Body)
if listResp.StatusCode == http.StatusOK { if listResp.StatusCode == http.StatusOK {
var libsResult map[string]interface{} var libsResult map[string]interface{}
json.NewDecoder(listResp.Body).Decode(&libsResult) err = json.NewDecoder(listResp.Body).Decode(&libsResult)
require.NoError(t, err)
if data, ok := libsResult["data"].([]interface{}); ok { if data, ok := libsResult["data"].([]interface{}); ok {
for _, lib := range data { for _, lib := range data {
@@ -80,7 +89,7 @@ func TestFullApplicationSetup(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Authorization", "Bearer "+token)
delLibResp, _ := client.Do(req) delLibResp, _ := client.Do(req)
if delLibResp != nil { if delLibResp != nil {
delLibResp.Body.Close() _ = delLibResp.Body.Close()
} }
} }
} }
@@ -108,7 +117,9 @@ func TestFullApplicationSetup(t *testing.T) {
body, _ := json.Marshal(userReq) body, _ := json.Marshal(userReq)
resp, err := http.Post(baseTestURL+"/auth/register", "application/json", bytes.NewBuffer(body)) resp, err := http.Post(baseTestURL+"/auth/register", "application/json", bytes.NewBuffer(body))
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Accept 201 (Created) or 409 (Conflict if already exists from previous incomplete test run) // Accept 201 (Created) or 409 (Conflict if already exists from previous incomplete test run)
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusConflict { if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusConflict {
@@ -116,7 +127,8 @@ func TestFullApplicationSetup(t *testing.T) {
} }
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
// If we got 409, the user already exists, so we need to login to get the token // If we got 409, the user already exists, so we need to login to get the token
if resp.StatusCode == http.StatusConflict { if resp.StatusCode == http.StatusConflict {
@@ -128,10 +140,13 @@ func TestFullApplicationSetup(t *testing.T) {
body, _ := json.Marshal(loginReq) body, _ := json.Marshal(loginReq)
resp2, err := http.Post(baseTestURL+"/auth/login", "application/json", bytes.NewBuffer(body)) resp2, err := http.Post(baseTestURL+"/auth/login", "application/json", bytes.NewBuffer(body))
assert.NoError(t, err) assert.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
assert.Equal(t, http.StatusOK, resp2.StatusCode) assert.Equal(t, http.StatusOK, resp2.StatusCode)
json.NewDecoder(resp2.Body).Decode(&result) err = json.NewDecoder(resp2.Body).Decode(&result)
require.NoError(t, err)
} }
if result["user"] != nil { if result["user"] != nil {
@@ -155,12 +170,15 @@ func TestFullApplicationSetup(t *testing.T) {
body, _ := json.Marshal(loginReq) body, _ := json.Marshal(loginReq)
resp, err := http.Post(baseTestURL+"/auth/login", "application/json", bytes.NewBuffer(body)) resp, err := http.Post(baseTestURL+"/auth/login", "application/json", bytes.NewBuffer(body))
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
token, ok := result["access_token"].(string) token, ok := result["access_token"].(string)
assert.True(t, ok, "Should have access_token") assert.True(t, ok, "Should have access_token")
@@ -185,7 +203,9 @@ func TestFullApplicationSetup(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
@@ -225,12 +245,15 @@ func TestFullApplicationSetup(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusCreated, resp.StatusCode) assert.Equal(t, http.StatusCreated, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, getUploadPath(), result["folder_path"]) assert.Equal(t, getUploadPath(), result["folder_path"])
@@ -251,13 +274,16 @@ func TestFullApplicationSetup(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
// Accept 200 or 202 // Accept 200 or 202
assert.Contains(t, []int{http.StatusOK, http.StatusAccepted}, resp.StatusCode) assert.Contains(t, []int{http.StatusOK, http.StatusAccepted}, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
assert.Equal(t, "success", result["status"]) assert.Equal(t, "success", result["status"])
@@ -276,12 +302,15 @@ func TestFullApplicationSetup(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
assert.NoError(t, err) assert.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
data, ok := result["data"].([]interface{}) data, ok := result["data"].([]interface{})
assert.True(t, ok, "Data field should exist") assert.True(t, ok, "Data field should exist")
+23 -9
View File
@@ -36,7 +36,9 @@ func TestSevenDaySession(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -81,12 +83,15 @@ func TestSevenDaySession(t *testing.T) {
loginResp, err := http.DefaultClient.Do(loginHTTP) loginResp, err := http.DefaultClient.Do(loginHTTP)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
require.Equal(t, http.StatusOK, loginResp.StatusCode) require.Equal(t, http.StatusOK, loginResp.StatusCode)
var loginResult map[string]interface{} var loginResult map[string]interface{}
json.NewDecoder(loginResp.Body).Decode(&loginResult) err = json.NewDecoder(loginResp.Body).Decode(&loginResult)
require.NoError(t, err)
refreshToken, ok := loginResult["refresh_token"].(string) refreshToken, ok := loginResult["refresh_token"].(string)
require.True(t, ok, "Should have refresh_token") require.True(t, ok, "Should have refresh_token")
@@ -103,12 +108,15 @@ func TestSevenDaySession(t *testing.T) {
refreshResp, err := http.DefaultClient.Do(refreshHTTP) refreshResp, err := http.DefaultClient.Do(refreshHTTP)
require.NoError(t, err) require.NoError(t, err)
defer refreshResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(refreshResp.Body)
assert.Equal(t, http.StatusOK, refreshResp.StatusCode) assert.Equal(t, http.StatusOK, refreshResp.StatusCode)
var refreshResult map[string]interface{} var refreshResult map[string]interface{}
json.NewDecoder(refreshResp.Body).Decode(&refreshResult) err = json.NewDecoder(refreshResp.Body).Decode(&refreshResult)
require.NoError(t, err)
// Verify ExpiresIn is 7 days // Verify ExpiresIn is 7 days
expiresIn, ok := refreshResult["expires_in"].(float64) expiresIn, ok := refreshResult["expires_in"].(float64)
@@ -134,7 +142,9 @@ func TestSevenDaySession(t *testing.T) {
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
var authResponse struct { var authResponse struct {
Token string `json:"access_token"` Token string `json:"access_token"`
@@ -230,7 +240,7 @@ func TestNoClientSideCookies(t *testing.T) {
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
resp.Body.Close() _ = resp.Body.Close()
// Accept both 201 (new user) and 409 (already exists from previous run) // Accept both 201 (new user) and 409 (already exists from previous run)
require.True(t, resp.StatusCode == http.StatusCreated || resp.StatusCode == http.StatusConflict, require.True(t, resp.StatusCode == http.StatusCreated || resp.StatusCode == http.StatusConflict,
@@ -253,7 +263,9 @@ func TestNoClientSideCookies(t *testing.T) {
resp2, err := http.DefaultClient.Do(req2) resp2, err := http.DefaultClient.Do(req2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
body, err := io.ReadAll(resp2.Body) body, err := io.ReadAll(resp2.Body)
require.NoError(t, err) require.NoError(t, err)
@@ -277,7 +289,9 @@ func TestNoClientSideCookies(t *testing.T) {
loginResp, err := http.DefaultClient.Do(loginReq) loginResp, err := http.DefaultClient.Do(loginReq)
require.NoError(t, err) require.NoError(t, err)
defer loginResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(loginResp.Body)
assert.Equal(t, http.StatusOK, loginResp.StatusCode) assert.Equal(t, http.StatusOK, loginResp.StatusCode)
+5 -2
View File
@@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
@@ -30,7 +31,7 @@ func TestTagsFilter(t *testing.T) {
folderHTTP.Header.Set("Authorization", "Bearer "+setup.UserToken) folderHTTP.Header.Set("Authorization", "Bearer "+setup.UserToken)
folderResp, err := client.Do(folderHTTP) folderResp, err := client.Do(folderHTTP)
require.NoError(t, err) require.NoError(t, err)
folderResp.Body.Close() _ = folderResp.Body.Close()
require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Should add folder to library") require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Should add folder to library")
// Helper to create book with tags // Helper to create book with tags
@@ -50,7 +51,9 @@ func TestTagsFilter(t *testing.T) {
req.Header.Set("Authorization", "Bearer "+setup.UserToken) req.Header.Set("Authorization", "Bearer "+setup.UserToken)
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode, "Should create book") require.Equal(t, http.StatusCreated, resp.StatusCode, "Should create book")
} }
+9 -3
View File
@@ -6,6 +6,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"sync" "sync"
@@ -98,11 +99,14 @@ func createTestLibraryWithFolder(t *testing.T, ts *httptest.Server, token, name
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(libHTTP) resp, err := client.Do(libHTTP)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode, "Library creation should succeed") require.Equal(t, http.StatusCreated, resp.StatusCode, "Library creation should succeed")
var libResponse map[string]interface{} var libResponse map[string]interface{}
json.NewDecoder(resp.Body).Decode(&libResponse) err = json.NewDecoder(resp.Body).Decode(&libResponse)
require.NoError(t, err)
libraryID := libResponse["id"].(string) libraryID := libResponse["id"].(string)
if withFolder { if withFolder {
@@ -117,7 +121,9 @@ func createTestLibraryWithFolder(t *testing.T, ts *httptest.Server, token, name
folderResp, err := client.Do(folderHTTP) folderResp, err := client.Do(folderHTTP)
require.NoError(t, err) require.NoError(t, err)
defer folderResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(folderResp.Body)
require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Folder creation should succeed") require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Folder creation should succeed")
} }
+27 -10
View File
@@ -13,6 +13,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net" "net"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@@ -315,12 +316,15 @@ func loginUserWithCredentials(t *testing.T, ts *httptest.Server, email, password
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err, "Failed to login") require.NoError(t, err, "Failed to login")
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusOK, resp.StatusCode, "Login should succeed") require.Equal(t, http.StatusOK, resp.StatusCode, "Login should succeed")
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
token, ok := result["access_token"].(string) token, ok := result["access_token"].(string)
require.True(t, ok, "Should have access_token") require.True(t, ok, "Should have access_token")
@@ -648,12 +652,15 @@ func loginWithCredentials(t *testing.T, ts *httptest.Server, email, password str
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err, "Failed to login") require.NoError(t, err, "Failed to login")
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusOK, resp.StatusCode, "Login should succeed") require.Equal(t, http.StatusOK, resp.StatusCode, "Login should succeed")
var result map[string]interface{} var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result) err = json.NewDecoder(resp.Body).Decode(&result)
require.NoError(t, err)
token, ok := result["access_token"].(string) token, ok := result["access_token"].(string)
require.True(t, ok, "Should have access_token") require.True(t, ok, "Should have access_token")
@@ -698,12 +705,15 @@ func createTestMediaItemID(t *testing.T, setup *TestServerSetup) string {
resp, err := httpClient.Do(req) resp, err := httpClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
var libResult map[string]interface{} var libResult map[string]interface{}
json.NewDecoder(resp.Body).Decode(&libResult) err = json.NewDecoder(resp.Body).Decode(&libResult)
require.NoError(t, err)
libData := libResult["id"].(string) libData := libResult["id"].(string)
@@ -718,7 +728,9 @@ func createTestMediaItemID(t *testing.T, setup *TestServerSetup) string {
folderResp, err := httpClient.Do(folderReqHTTP) folderResp, err := httpClient.Do(folderReqHTTP)
require.NoError(t, err) require.NoError(t, err)
defer folderResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(folderResp.Body)
require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Library folder creation is required before adding media items") require.Equal(t, http.StatusCreated, folderResp.StatusCode, "Library folder creation is required before adding media items")
mediaItemReq := map[string]interface{}{ mediaItemReq := map[string]interface{}{
@@ -737,12 +749,15 @@ func createTestMediaItemID(t *testing.T, setup *TestServerSetup) string {
resp2, err := httpClient.Do(req2) resp2, err := httpClient.Do(req2)
require.NoError(t, err) require.NoError(t, err)
defer resp2.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp2.Body)
require.Equal(t, http.StatusCreated, resp2.StatusCode) require.Equal(t, http.StatusCreated, resp2.StatusCode)
var mediaItemResult map[string]interface{} var mediaItemResult map[string]interface{}
json.NewDecoder(resp2.Body).Decode(&mediaItemResult) err = json.NewDecoder(resp2.Body).Decode(&mediaItemResult)
require.NoError(t, err)
mediaItemID := mediaItemResult["id"].(string) mediaItemID := mediaItemResult["id"].(string)
@@ -771,6 +786,8 @@ func addFolderToLibrary(t *testing.T, setup *TestServerSetup, libraryID string,
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
} }
+16 -6
View File
@@ -6,6 +6,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"net/http" "net/http"
"strings" "strings"
"testing" "testing"
@@ -83,7 +84,9 @@ func TestWebSocketDeviceAuth(t *testing.T) {
require.NoError(t, err, "WebSocket connection with device token should succeed") require.NoError(t, err, "WebSocket connection with device token should succeed")
defer ws.Close() defer ws.Close()
if resp != nil { if resp != nil {
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
require.Equal(t, http.StatusSwitchingProtocols, resp.StatusCode, "Should upgrade to WebSocket") require.Equal(t, http.StatusSwitchingProtocols, resp.StatusCode, "Should upgrade to WebSocket")
} }
// Read initial state message // Read initial state message
@@ -135,7 +138,9 @@ func TestWebSocketProgressBroadcast(t *testing.T) {
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
defer resp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
@@ -253,11 +258,14 @@ func TestWebSocketUserScopedBroadcast(t *testing.T) {
collectionResp, err := client.Do(collectionHTTP) collectionResp, err := client.Do(collectionHTTP)
require.NoError(t, err) require.NoError(t, err)
defer collectionResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(collectionResp.Body)
require.Equal(t, http.StatusCreated, collectionResp.StatusCode) require.Equal(t, http.StatusCreated, collectionResp.StatusCode)
var collectionResult map[string]interface{} var collectionResult map[string]interface{}
json.NewDecoder(collectionResp.Body).Decode(&collectionResult) err = json.NewDecoder(collectionResp.Body).Decode(&collectionResult)
require.NoError(t, err)
collectionID := collectionResult["id"].(string) collectionID := collectionResult["id"].(string)
// Create a test book via API // Create a test book via API
@@ -289,7 +297,9 @@ func TestWebSocketUserScopedBroadcast(t *testing.T) {
addResp, err := client.Do(addHTTP) addResp, err := client.Do(addHTTP)
require.NoError(t, err) require.NoError(t, err)
defer addResp.Body.Close() defer func(Body io.ReadCloser) {
_ = Body.Close()
}(addResp.Body)
require.Equal(t, http.StatusNoContent, addResp.StatusCode) require.Equal(t, http.StatusNoContent, addResp.StatusCode)
// Admin should receive collection_updated message // Admin should receive collection_updated message
@@ -313,7 +323,7 @@ func connectWebSocketToServer(t *testing.T, serverURL string, token string) *web
ws, resp, err := websocket.DefaultDialer.Dial(wsURL, nil) ws, resp, err := websocket.DefaultDialer.Dial(wsURL, nil)
require.NoError(t, err, "WebSocket connection should succeed") require.NoError(t, err, "WebSocket connection should succeed")
if resp != nil { if resp != nil {
resp.Body.Close() _ = resp.Body.Close()
} }
require.NotNil(t, ws, "WebSocket connection should be established") require.NotNil(t, ws, "WebSocket connection should be established")
+7 -5
View File
@@ -41,8 +41,9 @@ func TestWorker_DirectoryScanJob(t *testing.T) {
require.Equal(t, http.StatusCreated, createLibResp.StatusCode) require.Equal(t, http.StatusCreated, createLibResp.StatusCode)
var createLibResponse map[string]interface{} var createLibResponse map[string]interface{}
json.NewDecoder(createLibResp.Body).Decode(&createLibResponse) err = json.NewDecoder(createLibResp.Body).Decode(&createLibResponse)
createLibResp.Body.Close() require.NoError(t, err)
_ = createLibResp.Body.Close()
libraryID, ok := createLibResponse["id"].(string) libraryID, ok := createLibResponse["id"].(string)
require.True(t, ok) require.True(t, ok)
@@ -62,7 +63,7 @@ func TestWorker_DirectoryScanJob(t *testing.T) {
resp, err := client.Do(req) resp, err := client.Do(req)
require.NoError(t, err) require.NoError(t, err)
resp.Body.Close() _ = resp.Body.Close()
require.Equal(t, http.StatusCreated, resp.StatusCode) require.Equal(t, http.StatusCreated, resp.StatusCode)
// Create test files in the directory // Create test files in the directory
@@ -141,8 +142,9 @@ func TestWorker_SetFoldersJob(t *testing.T) {
require.Equal(t, http.StatusCreated, createLibResp.StatusCode) require.Equal(t, http.StatusCreated, createLibResp.StatusCode)
var createLibResponse map[string]interface{} var createLibResponse map[string]interface{}
json.NewDecoder(createLibResp.Body).Decode(&createLibResponse) err = json.NewDecoder(createLibResp.Body).Decode(&createLibResponse)
createLibResp.Body.Close() require.NoError(t, err)
_ = createLibResp.Body.Close()
libraryID, ok := createLibResponse["id"].(string) libraryID, ok := createLibResponse["id"].(string)
require.True(t, ok) require.True(t, ok)