Add comprehensive test coverage for media scanning functionality: - fsnotify_integration_test.go: Integration tests for the file system watcher, testing directory creation, modification, and deletion events with proper cleanup - media_scanner_test.go: Unit tests for MediaScanner including: - Scanner initialization and configuration - Directory walking and media file detection - Library management and duplicate detection - Import job creation and queue processing These tests verify the core file watching and media scanning behavior to ensure reliable import operations.
75 lines
2.5 KiB
Go
75 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFSNotify_BulkFileDetection(t *testing.T) {
|
|
setup := setupTestServer(t)
|
|
defer setup.Close()
|
|
t.Run("Detects multiple files added simultaneously", func(t *testing.T) {
|
|
token := setup.Token
|
|
tmpDir := t.TempDir()
|
|
// Create library
|
|
createLibReq := map[string]interface{}{
|
|
"name": "bulk-test-library",
|
|
"type": "ebooks",
|
|
}
|
|
libBody, _ := json.Marshal(createLibReq)
|
|
libReq, _ := http.NewRequest("POST", setup.Server.URL+"/api/libraries", bytes.NewBuffer(libBody))
|
|
libReq.Header.Set("Content-Type", "application/json")
|
|
libReq.Header.Set("Authorization", "Bearer "+token)
|
|
client := &http.Client{}
|
|
libResp, err := client.Do(libReq)
|
|
require.NoError(t, err)
|
|
defer libResp.Body.Close()
|
|
require.Equal(t, http.StatusCreated, libResp.StatusCode)
|
|
var libResult map[string]interface{}
|
|
json.NewDecoder(libResp.Body).Decode(&libResult)
|
|
libraryID := libResult["id"].(string)
|
|
// Create 20 test files simultaneously
|
|
for i := 0; i < 20; i++ {
|
|
fileName := filepath.Join(tmpDir, fmt.Sprintf("book%d.epub", i))
|
|
err := os.WriteFile(fileName, []byte(fmt.Sprintf("test %d", i)), 0644)
|
|
require.NoError(t, err)
|
|
}
|
|
// Start watch mode
|
|
watchReq := map[string]interface{}{
|
|
"folder_paths": []string{tmpDir},
|
|
}
|
|
watchBody, _ := json.Marshal(watchReq)
|
|
watchReqObj, _ := http.NewRequest("POST", setup.Server.URL+"/api/scanner/start", bytes.NewBuffer(watchBody))
|
|
watchReqObj.Header.Set("Content-Type", "application/json")
|
|
watchReqObj.Header.Set("Authorization", "Bearer "+token)
|
|
watchResp, err := client.Do(watchReqObj)
|
|
require.NoError(t, err)
|
|
watchResp.Body.Close()
|
|
// Wait for detection - 12 seconds accounts for 10s batch + processing time
|
|
time.Sleep(12 * time.Second)
|
|
// Check items
|
|
req, _ := http.NewRequest("GET", setup.Server.URL+"/api/libraries/"+libraryID+"/items", nil)
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
itemsResp, err := client.Do(req)
|
|
require.NoError(t, err)
|
|
defer itemsResp.Body.Close()
|
|
var itemsResult map[string]interface{}
|
|
json.NewDecoder(itemsResp.Body).Decode(&itemsResult)
|
|
items := itemsResult["items"].([]interface{})
|
|
assert.GreaterOrEqual(t, len(items), 20, "Should detect all 20 files")
|
|
// Cleanup
|
|
deleteReq, _ := http.NewRequest("DELETE", setup.Server.URL+"/api/libraries/"+libraryID, nil)
|
|
deleteReq.Header.Set("Authorization", "Bearer "+token)
|
|
client.Do(deleteReq)
|
|
})
|
|
}
|