test: add integration and unit tests for file watching
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.
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user