# End-to-End Test Guide

Dieses Dokument beschreibt, wie Sie das Email-Sortierer System vollständig testen können.

## Voraussetzungen

Bevor Sie die Tests durchführen können, müssen Sie:

1. ✅ Alle Dependencies installiert haben (`npm install` in server/)
2. ✅ Eine `.env` Datei mit allen erforderlichen Credentials erstellt haben
3. ✅ Das Bootstrap-Script ausgeführt haben (`npm run bootstrap`)
4. ✅ Den Server gestartet haben (`npm start`)

## Automatisierter End-to-End Test

Der automatisierte Test überprüft alle Backend-Komponenten:

```bash
cd server
npm test
```

### Was wird getestet?

1. **Fragen laden** (Requirements 1.1, 2.4)
   - Lädt alle aktiven Fragen für das Produkt "email-sorter"
   - Verifiziert, dass Fragen korrekt nach Step und Order sortiert sind
   - Validiert Property 1: Question Loading

2. **Submission erstellen** (Requirements 2.2, 2.3)
   - Erstellt eine neue Submission mit Test-Antworten
   - Speichert Kundeninformationen (Email, Name)
   - Validiert Property 2: Submission Creation

3. **Antworten speichern** (Requirements 2.3)
   - Speichert alle Antworten in der Answers Collection
   - Verifiziert, dass Antworten korrekt abgerufen werden können

4. **Stripe Checkout Session** (Requirements 3.1, 3.2)
   - Erstellt eine Stripe Checkout Session
   - Verifiziert, dass eine gültige Checkout-URL zurückgegeben wird
   - Validiert Property 3: Payment Flow

5. **Webhook Konfiguration** (Requirements 3.4)
   - Überprüft, dass Webhook Secret konfiguriert ist
   - Validiert Property 4: Webhook Validation

6. **Payment Completion** (Requirements 3.3)
   - Simuliert erfolgreiche Bezahlung
   - Aktualisiert Submission Status auf "paid"
   - Erstellt Order-Record

7. **Kompletter Datenfluss**
   - Verifiziert, dass alle Daten korrekt gespeichert wurden
   - Überprüft Verknüpfungen zwischen Collections

### Erwartete Ausgabe

```
🧪 Starting End-to-End Test

Test 1: Loading questions from Appwrite...
✅ Product found: Email Sorter Setup (49.00 EUR)
✅ Loaded 13 questions
✅ Questions are properly ordered by step and order

Test 2: Creating submission with test answers...
✅ Submission created with ID: [ID]

Test 3: Saving answers to Appwrite...
✅ Answers saved with ID: [ID]
✅ Answers can be retrieved correctly

Test 4: Creating Stripe checkout session...
✅ Stripe session created: [SESSION_ID]
   Checkout URL: https://checkout.stripe.com/...

Test 5: Verifying webhook signature validation...
✅ Webhook secret is configured

Test 6: Simulating payment completion...
✅ Submission status updated to "paid"
✅ Order record created with ID: [ID]

Test 7: Verifying complete data flow...
✅ Data verification:
   - Submission status: paid
   - Answers records: 1
   - Order records: 1

✅ All tests passed!

📊 Test Summary:
   ✅ Questions loaded and ordered correctly
   ✅ Submission created successfully
   ✅ Answers saved and retrieved correctly
   ✅ Stripe checkout session created
   ✅ Webhook configuration verified
   ✅ Payment completion simulated
   ✅ Complete data flow verified

🎉 End-to-End test completed successfully!
```

## Manueller Frontend Test

Um das Frontend manuell zu testen:

1. **Server starten:**
   ```bash
   cd server
   npm start
   ```

2. **Browser öffnen:**
   - Navigieren Sie zu http://localhost:3000

3. **Fragebogen ausfüllen:**
   - Schritt 1: Kontaktinformationen
     - Email: test@example.com
     - Name: Test User
     - Firma: Test Company
   
   - Schritt 2: Unternehmensgröße
     - Mitarbeiter: 1-10
     - Email-Volumen: 100-500
   
   - Schritt 3: Aktueller Anbieter
     - Provider: Gmail
   
   - Schritt 4: Probleme (Multiselect)
     - Wählen Sie: Spam, Organization
   
   - Schritt 5: Budget
     - Budget: 50-100
   
   - Schritt 6: Timeline
     - Timeline: Sofort
   
   - Schritt 7: Gewünschte Features (Multiselect)
     - Wählen Sie: Auto-Sorting, Priority Inbox
   
   - Schritt 8: Integration
     - Integration: Ja
   
   - Schritt 9: Datenschutz
     - Datenschutz: Sehr wichtig
   
   - Schritt 10: Zusätzliche Informationen
     - Text: "Test submission"

4. **Zusammenfassung überprüfen:**
   - Alle Antworten sollten korrekt angezeigt werden
   - "Jetzt kaufen" Button sollte sichtbar sein

5. **Bezahlung testen:**
   - Klicken Sie auf "Jetzt kaufen"
   - Sie werden zu Stripe Checkout weitergeleitet
   - Verwenden Sie Test-Kreditkarte: `4242 4242 4242 4242`
   - Ablaufdatum: Beliebiges zukünftiges Datum
   - CVC: Beliebige 3 Ziffern

6. **Daten in Appwrite überprüfen:**
   - Öffnen Sie Ihr Appwrite Dashboard
   - Navigieren Sie zur EmailSorter Database
   - Überprüfen Sie die Collections:
     - **Submissions**: Sollte einen neuen Eintrag mit status "paid" haben
     - **Answers**: Sollte die gespeicherten Antworten enthalten
     - **Orders**: Sollte einen Order-Record haben

## Webhook Test

Um den Stripe Webhook zu testen:

1. **Stripe CLI installieren:**
   ```bash
   stripe login
   ```

2. **Webhook forwarding starten:**
   ```bash
   stripe listen --forward-to localhost:3000/stripe/webhook
   ```

3. **Webhook Secret kopieren:**
   - Kopieren Sie das angezeigte Secret (whsec_...)
   - Fügen Sie es in Ihre `.env` als `STRIPE_WEBHOOK_SECRET` ein
   - Starten Sie den Server neu

4. **Test-Event senden:**
   ```bash
   stripe trigger checkout.session.completed
   ```

5. **Logs überprüfen:**
   - Server-Logs sollten "Webhook received" zeigen
   - Appwrite sollte eine neue Order haben

## Validierung der Correctness Properties

### Property 1: Question Loading
**Test:** Fragen werden korrekt geladen und sortiert
- ✅ Automatischer Test verifiziert Sortierung nach step und order
- ✅ Nur aktive Fragen werden zurückgegeben

### Property 2: Submission Creation
**Test:** Submissions werden korrekt erstellt
- ✅ Automatischer Test erstellt Submission mit allen Feldern
- ✅ SubmissionId wird zurückgegeben

### Property 3: Payment Flow
**Test:** Checkout-Flow funktioniert
- ✅ Automatischer Test erstellt Stripe Session
- ✅ Checkout URL wird generiert

### Property 4: Webhook Validation
**Test:** Webhook-Signatur wird validiert
- ✅ Server prüft Stripe-Signatur
- ✅ Ungültige Signaturen werden mit 400 abgelehnt

## Fehlerbehebung

### Test schlägt fehl: "Missing required environment variable"
- Überprüfen Sie, dass alle Variablen in `.env` gesetzt sind
- Kopieren Sie `.env.example` zu `.env` und füllen Sie alle Werte aus

### Test schlägt fehl: "No active product found"
- Führen Sie das Bootstrap-Script aus: `npm run bootstrap`
- Überprüfen Sie, dass `APPWRITE_DATABASE_ID` korrekt gesetzt ist

### Test schlägt fehl: "Stripe error"
- Überprüfen Sie, dass `STRIPE_SECRET_KEY` korrekt ist
- Verwenden Sie einen Test-Key (sk_test_...)

### Frontend lädt keine Fragen
- Öffnen Sie die Browser-Konsole (F12)
- Überprüfen Sie auf Netzwerkfehler
- Stellen Sie sicher, dass der Server läuft

### Webhook funktioniert nicht
- Stellen Sie sicher, dass Stripe CLI läuft
- Überprüfen Sie, dass `STRIPE_WEBHOOK_SECRET` korrekt ist
- Überprüfen Sie Server-Logs auf Fehler

## Erfolgreiche Test-Checkliste

- [ ] Automatischer E2E-Test läuft ohne Fehler durch
- [ ] Frontend lädt alle 13 Fragen
- [ ] Navigation zwischen Steps funktioniert
- [ ] Validierung von Pflichtfeldern funktioniert
- [ ] Zusammenfassung zeigt alle Antworten
- [ ] Stripe Checkout wird korrekt erstellt
- [ ] Submission wird in Appwrite gespeichert
- [ ] Answers werden in Appwrite gespeichert
- [ ] Webhook aktualisiert Submission Status
- [ ] Order wird nach Bezahlung erstellt

Wenn alle Punkte erfüllt sind, ist das System vollständig funktionsfähig! 🎉
