Project-Image-Uploader/tests/TESTING-CLEANUP.md
matthias.lotz 4ee1b76d77 docs: Finalize automatic cleanup feature documentation
- Update README.md with comprehensive feature description
  - Add automatic cleanup and deletion log to features list
  - Document countdown display and 7-day retention policy
  - Add Testing section with test-cleanup.sh instructions
  - Update API endpoints with new admin routes

- Update CHANGELOG.md with complete feature overview
  - Backend: Services, Repositories, Scheduler, API endpoints
  - Frontend: DeletionLogSection, countdown, SweetAlert2 feedback
  - Infrastructure: nginx config updates
  - Testing: Comprehensive test tools and documentation

- Update TODO.md marking feature as completed

- Update FEATURE_PLAN with final status
  - All 11 tasks completed (100%)
  - Bug fixes documented
  - Deployment checklist updated
  - Final timeline and statistics

- Organize test files into tests/ directory
  - Move TESTING-CLEANUP.md to tests/
  - Move test-cleanup.sh to tests/

Feature is now complete and ready for merge.
2025-11-08 14:45:13 +01:00

8.7 KiB

Testing Guide: Automatisches Löschen von nicht-freigegebenen Gruppen

Dieses Dokument beschreibt, wie du das Feature "Automatisches Löschen von nicht-freigegebenen Gruppen nach 7 Tagen" testen kannst.

Übersicht

Das System löscht automatisch alle Gruppen, die nach 7 Tagen nicht freigegeben wurden. Der Cleanup läuft täglich um 10:00 Uhr (Europe/Berlin).

Voraussetzungen

Test-Tools

1. Bash-Script (empfohlen)

Das einfachste Tool zum Testen:

./test-cleanup.sh

Menü-Optionen:

  1. Zeige nicht-freigegebene Gruppen - Übersicht mit Alter in Tagen
  2. Gruppe zurückdatieren - Upload-Datum ändern für Tests
  3. Preview - Zeige welche Gruppen gelöscht würden (Dry-Run)
  4. Cleanup ausführen - Führe Löschung jetzt manuell aus
  5. Lösch-Historie - Zeige bereits gelöschte Gruppen

2. Node.js Script (Alternative)

node backend/src/scripts/test-cleanup.js

Bietet dieselben Funktionen wie das Bash-Script.

3. API-Endpunkte (Direkt)

# Preview: Was würde gelöscht werden?
curl http://localhost:5001/api/admin/cleanup/preview | jq

# Cleanup manuell triggern
curl -X POST http://localhost:5001/api/admin/cleanup/trigger | jq

# Lösch-Historie abrufen
curl http://localhost:5001/api/admin/deletion-log?limit=10 | jq

Test-Szenarien

Szenario 1: Countdown-Anzeige testen

Ziel: Überprüfen, ob der Countdown bei wartenden Gruppen angezeigt wird

  1. Lade eine neue Gruppe hoch (über http://localhost:3000)
  2. Gehe zu http://localhost:3000/moderation
  3. Erwartung: Bei der neuen Gruppe siehst du " 7 Tage bis Löschung"
  4. Die Gruppe ist in der Sektion "🔍 Wartende Freigabe"

Szenario 2: Freigabe testen

Ziel: Überprüfen, ob die Freigabe funktioniert und der Countdown verschwindet

  1. Gehe zu http://localhost:3000/moderation
  2. Klicke bei einer wartenden Gruppe auf "Freigeben"
  3. Erwartung:
    • SweetAlert2-Popup: "Gruppe freigegeben"
    • Gruppe wechselt zu " Freigegebene Gruppen"
    • Countdown verschwindet
    • Gruppe wird NICHT mehr gelöscht (egal wie alt)

Szenario 3: Cleanup simulieren (Gruppe zurückdatieren)

Ziel: Eine Gruppe künstlich altern lassen, um Cleanup zu testen

  1. Starte Test-Tool:

    ./test-cleanup.sh
    
  2. Wähle Option 1 - Zeige nicht-freigegebene Gruppen

    • Notiere dir eine Gruppe-ID (z.B. psvBaKvJn)
  3. Wähle Option 2 - Gruppe zurückdatieren

    • Gib die Gruppe-ID ein: psvBaKvJn
    • Gib Tage ein: 8 (älter als 7 Tage)
    • Erwartung: " Gruppe wurde um 8 Tage zurückdatiert"
  4. Prüfe im Frontend:

Szenario 4: Cleanup Preview (Dry-Run)

Ziel: Sehen welche Gruppen gelöscht würden, ohne sie zu löschen

  1. Starte Test-Tool:

    ./test-cleanup.sh
    
  2. Wähle Option 3 - Preview

    • Erwartung: Liste aller Gruppen, die älter als 7 Tage und nicht freigegeben sind
    • Zeigt Gruppe-ID, Jahr, Name, Upload-Datum, Tage seit Upload
  3. Oder direkt via API:

    curl http://localhost:5001/api/admin/cleanup/preview | jq
    

Szenario 5: Cleanup ausführen

Ziel: Gruppen tatsächlich löschen

⚠️ ACHTUNG: Dies löscht Gruppen permanent!

  1. Starte Test-Tool:

    ./test-cleanup.sh
    
  2. Wähle Option 4 - Cleanup ausführen

  3. Bestätige mit ja

  4. Erwartung:

    • " Cleanup abgeschlossen!"
    • Anzahl gelöschter Gruppen wird angezeigt
    • Backend-Logs zeigen Details:
      docker compose -f docker/dev/docker-compose.yml logs -f backend-dev
      
  5. Prüfe Ergebnis im Frontend:

    • http://localhost:3000/moderation
    • Scrolle nach unten zum Lösch-Historie Bereich
    • Erwartung:
      • Statistik-Cards zeigen gelöschte Gruppen/Bilder/Speicher
      • Tabelle zeigt Details der gelöschten Gruppen

Szenario 6: Lösch-Historie prüfen

Ziel: Verifizieren, dass gelöschte Gruppen protokolliert wurden

  1. Gehe zu http://localhost:3000/moderation

  2. Scrolle zum Bereich Lösch-Historie (ganz unten)

  3. Erwartung:

    • Statistik-Cards zeigen Summen
    • Tabelle zeigt gelöschte Gruppen mit:
      • Gruppe-ID
      • Jahr
      • Anzahl Bilder
      • Upload-Datum
      • Lösch-Datum
      • Grund: "auto_cleanup_7days"
      • Dateigröße
  4. Toggle "Alle anzeigen" / "Nur letzte 10" funktioniert

Manuelle Datenbankprüfung

Gruppen anzeigen

docker compose -f docker/dev/docker-compose.yml exec backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \
  "SELECT group_id, year, name, approved, datetime(upload_date), 
   CAST((julianday('now') - julianday(upload_date)) AS INTEGER) as days_old 
   FROM groups WHERE approved = 0;"

Deletion Log anzeigen

docker compose -f docker/dev/docker-compose.yml exec backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \
  "SELECT * FROM deletion_log ORDER BY deleted_at DESC LIMIT 5;"

Gruppe manuell zurückdatieren

# Setze Gruppe auf 8 Tage alt
docker compose -f docker/dev/docker-compose.yml exec backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \
  "UPDATE groups SET upload_date = datetime('now', '-8 days') WHERE group_id = 'DEINE_GRUPPE_ID';"

Erwartete Ergebnisse

Erfolgreich wenn:

  1. Countdown funktioniert:

    • Wird bei wartenden Gruppen angezeigt
    • Zeigt korrekte Anzahl Tage
    • Verschwindet nach Freigabe
  2. Freigabe funktioniert:

    • SweetAlert2-Feedback erscheint
    • Gruppe wechselt Sektion
    • Freigegebene Gruppen werden NIEMALS gelöscht
  3. Cleanup funktioniert:

    • Nur Gruppen > 7 Tage und nicht freigegeben werden gelöscht
    • Physische Dateien (Original + Preview) werden gelöscht
    • Datenbankeinträge werden entfernt
    • Deletion Log wird erstellt
  4. Lösch-Log funktioniert:

    • Statistiken korrekt
    • Tabelle zeigt alle gelöschten Gruppen
    • Toggle zwischen "Letzte 10" / "Alle" funktioniert
    • Dateigröße formatiert (KB/MB/GB)

Fehler falls:

  1. Countdown nicht sichtbar
  2. Freigabe ändert Status nicht
  3. Freigegebene Gruppen werden gelöscht
  4. Gruppen < 7 Tage werden gelöscht
  5. Deletion Log bleibt leer
  6. Physische Dateien bleiben erhalten
  7. Backend-Fehler in Logs

Cron-Job testen

Der automatische Cleanup läuft täglich um 10:00 Uhr. Zum Testen:

Option 1: Zeit simulieren (nicht empfohlen)

  • Systemzeit ändern
  • Container neustarten

Option 2: Cron-Zeit anpassen (für Tests)

Editiere backend/src/services/SchedulerService.js:

// Statt '0 10 * * *' (10:00 Uhr täglich)
// Nutze '*/5 * * * *' (alle 5 Minuten)
cron.schedule('*/5 * * * *', async () => {
    await this.cleanupService.performScheduledCleanup();
}, {
    timezone: 'Europe/Berlin'
});

Container neustarten und beobachten.

Option 3: Manuell triggern (empfohlen)

Nutze die Test-Tools (siehe oben), um Cleanup sofort auszuführen.

Troubleshooting

Problem: "Module not found: node-cron"

docker compose -f docker/dev/docker-compose.yml exec backend-dev npm install node-cron

Problem: Cleanup löscht nichts

  1. Prüfe ob Gruppen vorhanden und nicht freigegeben:

    ./test-cleanup.sh
    # Option 1
    
  2. Prüfe ob Gruppen alt genug (> 7 Tage):

    ./test-cleanup.sh
    # Option 3 (Preview)
    
  3. Datiere Gruppe zurück für Tests:

    ./test-cleanup.sh
    # Option 2
    

Problem: API-Endpunkte nicht erreichbar

  1. Prüfe Container-Status:

    docker compose -f docker/dev/docker-compose.yml ps
    
  2. Prüfe Backend-Logs:

    docker compose -f docker/dev/docker-compose.yml logs -f backend-dev
    
  3. Prüfe nginx-Konfiguration für /api/admin Route

Problem: Lösch-Log leer im Frontend

  1. Prüfe Browser-Konsole auf Fehler
  2. Prüfe nginx-Authentifizierung (Passwort)
  3. Teste API direkt:
    curl http://localhost:5001/api/admin/deletion-log?limit=10
    

Cleanup nach Tests

Nach dem Testen kannst du die Testdaten löschen:

# Deletion Log leeren
docker compose -f docker/dev/docker-compose.yml exec backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \
  "DELETE FROM deletion_log;"

# Alle nicht-freigegebenen Gruppen löschen
docker compose -f docker/dev/docker-compose.yml exec backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \
  "DELETE FROM groups WHERE approved = 0;"

Nächste Schritte

Nach erfolgreichem Testing:

  1. Feature-Branch mergen
  2. Dokumentation aktualisieren (README.md, CHANGELOG.md)
  3. TODO.md aktualisieren
  4. Production-Deployment vorbereiten