# Files Management System - Testing Guide

## Prerequisites

1. Run database migration:
```bash
# Set in .env
RUN_MIGRATIONS=true

# Or run manually
migrate -path database/migrations -database "postgresql://user:pass@localhost:5432/fotbal?sslmode=disable" up
```

2. Start the application:
```bash
go run main.go
```

3. Start the frontend:
```bash
cd frontend
npm start
```

## Test Scenarios

### 1. File Upload Tracking

**Test:** Upload a new file
```bash
# Upload via API
curl -X POST http://localhost:8080/api/v1/upload \
  -H "Content-Type: multipart/form-data" \
  -F "file=@test-image.jpg" \
  -b "cookies.txt"
```

**Expected:**
- File is saved to `uploads/YYYY/MM/` directory
- Database record created in `uploaded_files` table
- File appears in admin files list

**Verify:**
- Navigate to `/admin/soubory`
- Check if file appears in "Všechny soubory" tab
- Verify metadata (size, type, date) is correct

### 2. Usage Tracking - Article

**Test:** Create article with image
1. Go to `/admin/clanky`
2. Create new article
3. Upload or select an image
4. Save article

**Expected:**
- File usage record created in `file_usages` table
- Usage count = 1 in files list
- Usage details show article title and link

**Verify:**
- Go to `/admin/soubory`
- Find the uploaded image
- Click on usage count badge
- Modal shows article where it's used

### 3. Usage Tracking - Player

**Test:** Create player with image
1. Go to `/admin/hraci`
2. Create new player
3. Upload player photo
4. Save player

**Expected:**
- File usage tracked for player entity
- Usage details show player name

**Verify:**
- Check file usage in files admin
- Verify entity_type = "player"
- Verify link to player detail works

### 4. Unused Files Detection

**Test:** Upload file without using it
1. Upload image via upload API or article editor
2. Don't assign it to any entity
3. Navigate to `/admin/soubory`
4. Click "Nepoužívané" tab

**Expected:**
- File appears in unused files list
- Safe to delete without warnings

**Verify:**
- Unused file is listed
- Can delete without "in use" warning

### 5. Duplicate Detection

**Test:** Upload same file twice
1. Upload `test.jpg`
2. Upload the same `test.jpg` again (or copy with different name)
3. Go to `/admin/soubory`
4. Click "Duplicity" tab

**Expected:**
- Files grouped by MD5 hash
- Shows 2+ files in same group
- Both files visible in duplicate group

**Verify:**
- Duplicate group shows hash
- All duplicate files listed
- Can compare file details

### 6. Safe Deletion - File in Use

**Test:** Delete file that's being used
1. Use an image in an article
2. Go to `/admin/soubory`
3. Try to delete that image

**Expected:**
- Warning modal appears
- Shows where file is used (article title)
- Requires confirmation to force delete

**Verify:**
- Warning message displayed
- Usage details shown
- "Přesto smazat" button for force delete

### 7. Safe Deletion - Unused File

**Test:** Delete unused file
1. Upload file without using it
2. Go to `/admin/soubory` → Nepoužívané
3. Delete the file

**Expected:**
- Simple confirmation
- File deleted from disk and database
- No longer appears in any list

**Verify:**
- File removed from filesystem
- Database record deleted
- Not in any files list

### 8. File Scan and Sync

**Test:** Sync files with database
1. Manually copy a file to `uploads/2025/10/` directory
2. Go to `/admin/soubory`
3. Click "Skenovat soubory" button

**Expected:**
- Scan finds the manually added file
- Database record created
- File now appears in admin list
- Shows count of found/new/orphaned files

**Verify:**
- Toast shows scan results
- New file appears in list
- Correct metadata extracted

### 9. Search and Filter

**Test:** Search for files
1. Upload several files with different types
2. Go to `/admin/soubory`
3. Use search box to find specific file
4. Use MIME type filter

**Expected:**
- Search filters by filename
- MIME type dropdown filters results
- Results update in real-time

**Verify:**
- Search works for partial matches
- Filter works for image/pdf/etc.
- Results are accurate

### 10. Copy URL to Clipboard

**Test:** Copy file URL
1. Go to `/admin/soubory`
2. Click copy icon next to a file
3. Paste in browser or article editor

**Expected:**
- URL copied to clipboard
- Toast confirmation shown
- URL is valid and accessible

**Verify:**
- Toast says "Zkopírováno"
- Pasted URL works in browser
- URL format is correct (/uploads/...)

### 11. Usage Update on Entity Edit

**Test:** Update article image
1. Create article with image A
2. Edit article, change to image B
3. Check file usages

**Expected:**
- Image A usage removed
- Image B usage added
- Usage counts updated correctly

**Verify:**
- Image A shows 0 usage (if not used elsewhere)
- Image B shows usage for article
- Database reflects changes

### 12. Multiple Usages

**Test:** Use same file in multiple places
1. Upload one image
2. Use in 3 different articles
3. Check file details

**Expected:**
- Usage count = 3
- All 3 articles listed in usage modal
- Each usage shows correct entity info

**Verify:**
- Usage modal shows all 3 articles
- Each has correct title and link
- Usage count badge shows "3"

## API Testing

### Using curl or Postman

#### List all files
```bash
curl http://localhost:8080/api/v1/admin/files \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

#### Get unused files
```bash
curl http://localhost:8080/api/v1/admin/files/unused \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

#### Get duplicates
```bash
curl http://localhost:8080/api/v1/admin/files/duplicates \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

#### Get file usages
```bash
curl http://localhost:8080/api/v1/admin/files/123/usages \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

#### Delete file
```bash
curl -X DELETE http://localhost:8080/api/v1/admin/files/123 \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

#### Scan files
```bash
curl -X POST http://localhost:8080/api/v1/admin/files/scan \
  -H "Cookie: token=YOUR_JWT_TOKEN"
```

## Database Verification

### Check uploaded_files table
```sql
SELECT * FROM uploaded_files ORDER BY created_at DESC LIMIT 10;
```

### Check file_usages table
```sql
SELECT * FROM file_usages ORDER BY created_at DESC LIMIT 10;
```

### Find unused files
```sql
SELECT uf.* 
FROM uploaded_files uf
LEFT JOIN file_usages fu ON fu.file_id = uf.id
WHERE fu.id IS NULL;
```

### Find files with most usages
```sql
SELECT uf.filename, uf.file_url, COUNT(fu.id) as usage_count
FROM uploaded_files uf
LEFT JOIN file_usages fu ON fu.file_id = uf.id
GROUP BY uf.id
ORDER BY usage_count DESC
LIMIT 10;
```

### Find duplicate files
```sql
-- This requires calculating MD5 hashes in the application
-- The API endpoint handles this
```

## Performance Testing

### Large File Sets
1. Upload 100+ files
2. Test pagination and loading performance
3. Verify search/filter responsiveness

### Concurrent Operations
1. Multiple users uploading simultaneously
2. File usage tracking under load
3. Deletion operations concurrent with usage tracking

## Edge Cases

### Test these scenarios:

1. **File deleted from disk but still in DB**
   - Scan should mark as orphaned
   - Usage warnings should still work

2. **Very large files**
   - Test upload limits
   - Verify size display formatting

3. **Special characters in filename**
   - Upload files with special chars
   - Verify storage and retrieval

4. **Simultaneous usage updates**
   - Edit multiple entities using same file
   - Verify usage count accuracy

5. **Database connection issues**
   - Test graceful degradation
   - Verify tracking doesn't break uploads

## Success Criteria

✅ All files are tracked in database
✅ Usage tracking works for all entity types
✅ Unused files are correctly identified
✅ Duplicates are detected and grouped
✅ Safe deletion prevents data loss
✅ File scan syncs correctly
✅ Search and filter work accurately
✅ UI is responsive and user-friendly
✅ No performance issues with 100+ files
✅ All API endpoints return correct data

## Common Issues & Solutions

### Issue: Files not being tracked
**Solution:** Ensure `services.NewFileTracker()` is called after create/update in controllers

### Issue: Duplicates not detected
**Solution:** Verify MD5 hash calculation in `calculateFileMD5()` function

### Issue: Usage count incorrect
**Solution:** Check `TrackFileUsage()` is called with correct entity_type and entity_id

### Issue: Orphaned records
**Solution:** Run scan to sync database with filesystem

### Issue: Permission errors
**Solution:** Verify uploads directory permissions (755) and admin authentication
