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) }) }