# EspoCRM E2E Test Suite

Automatisierte End-to-End Tests für Custom EspoCRM Entities.

## Überblick

Das Test-Framework führt automatisiert folgende Tests durch:

### ✅ CRUD-Operationen
- **Create**: Erstellen von Testdatensätzen für alle Custom Entities
- **Read**: Validierung der erstellten Datensätze
- **Update**: Änderung von Feldern
- **Delete**: Löschen der Test-Daten

### 🔗 Relationship-Tests
- **Link**: Verknüpfung von Entities über Relationships
- **Unlink**: Entfernung von Verknüpfungen
- **Verification**: Prüfung der korrekten Verknüpfung

## Getestete Entities

1. **CMietobjekt** - Mietobjekte (Wohnungen, Häuser, etc.)
2. **CVmhMietverhältnis** - Mietverhältnisse
3. **CKündigung** - Kündigungen
4. **CBeteiligte** - Beteiligte Personen (Mieter, Vermieter)
5. **CMietinkasso** - Mietinkasso-Verfahren
6. **CVmhRäumungsklage** - Räumungsklagen

## Getestete Relationships

- CVmhMietverhältnis ↔ CMietobjekt
- CKündigung ↔ CVmhMietverhältnis  
- CBeteiligte ↔ CVmhMietverhältnis (als Mieter/Vermieter)

## Installation

### Voraussetzungen

- Python 3.6+
- `requests` Bibliothek

```bash
pip3 install requests
```

## Verwendung

### Schnellstart

```bash
./run_e2e_tests.sh
```

### Direkte Python-Ausführung

```bash
python3 e2e_tests.py
```

## Konfiguration

Die Konfiguration erfolgt in [e2e_tests.py](e2e_tests.py#L20-L25):

```python
CONFIG = {
    'base_url': 'https://crm.bitbylaw.com',
    'api_key': '2b0747ca34d15032aa233ae043cc61bc',
    'username': 'dev-test'
}
```

## Ausgabe

Das Framework generiert eine detaillierte Testübersicht:

```
================================================================================
                              TEST SUMMARY                                    
================================================================================

✅ CMietobjekt: 4/4 tests passed
   ✓ create                                  0.234s
   ✓ read                                    0.123s
   ✓ update                                  0.156s
   ✓ delete                                  0.089s

✅ CVmhMietverhltnis: 4/4 tests passed
   ✓ create                                  0.267s
   ✓ read                                    0.134s
   ✓ update                                  0.178s
   ✓ delete                                  0.092s

================================================================================
Total: 24/24 tests passed (0 failed)
Time: 3.45s
================================================================================
```

## Architektur

### Komponenten

#### 1. **espocrm_api_client.py**
API-Client für EspoCRM REST API mit folgenden Features:
- CRUD-Operationen (Create, Read, Update, Delete)
- Relationship-Management (Link, Unlink)
- Fehlerbehandlung und Logging

#### 2. **e2e_tests.py**
Haupttest-Framework mit:
- `EntityTestBase`: Basis-Klasse für Entity-Tests
- Spezifische Test-Klassen für jede Entity
- `TestTracker`: Ergebnis-Tracking und Reporting
- Automatisches Cleanup

#### 3. **run_e2e_tests.sh**
Shell-Wrapper mit:
- Dependency-Checks
- Farbiger Ausgabe
- Exit-Code-Handling

## Erweiterung

### Neue Entity hinzufügen

1. Neue Test-Klasse erstellen:

```python
class CMyEntityTest(EntityTestBase):
    def __init__(self, client: EspoCRMAPIClient, tracker: TestTracker):
        super().__init__(client, tracker)
        self.entity_type = 'CMyEntity'
    
    def run_full_test(self) -> Optional[str]:
        # Create
        data = {
            'name': f'Test Entity {datetime.now().strftime("%Y%m%d_%H%M%S")}',
            # ... weitere Felder
        }
        
        record_id = self.test_create(data)
        if not record_id:
            return None
        
        # Read
        self.test_read(record_id)
        
        # Update
        self.test_update(record_id, {'field': 'new_value'})
        
        return record_id
```

2. Test in `run_all_tests()` einbinden:

```python
print("\n🔷 Testing CMyEntity...")
myentity_test = CMyEntityTest(client, tracker)
myentity_id = myentity_test.run_full_test()
```

3. Cleanup-Order anpassen falls Dependencies bestehen

### Neue Relationships testen

```python
# Link testen
entity_test.test_link(
    record_id='123',
    link_name='relationshipName',
    foreign_id='456'
)

# Unlink testen
entity_test.test_unlink(
    record_id='123',
    link_name='relationshipName',
    foreign_id='456'
)
```

## Fehlerbehebung

### Connection Fehler

```
❌ Connection failed: HTTPError 401
```
→ API-Key oder Username prüfen

### Entity nicht gefunden

```
❌ API Error: POST https://crm.bitbylaw.com/api/v1/CMyEntity
   Status: 404
```
→ Entity-Name prüfen (z.B. `CKndigung` statt `CKuendigung`)

### Relationship nicht gefunden

```
AssertionError: Link not found: xyz123
```
→ Relationship-Name und Richtung prüfen

## Best Practices

1. **Immer cleanup durchführen**: Tests hinterlassen keine Datenreste
2. **Eindeutige Namen**: Timestamps in Test-Daten-Namen
3. **Dependencies beachten**: Lösch-Reihenfolge ist wichtig
4. **Fehlerbehandlung**: Jeder Test ist isoliert

## Weitere Informationen

- [EspoCRM REST API Dokumentation](https://docs.espocrm.com/development/api/)
- [Projektübersicht](KI_OVERVIEW_README.md)
- [Validierungs-Tools](VALIDATION_TOOLS.md)

## Support

Bei Fragen oder Problemen:
1. Logs prüfen: Test-Ausgabe enthält detaillierte Fehlermeldungen
2. API-Dokumentation konsultieren
3. Entity-Definitionen in `custom/Espo/Custom/Resources/metadata/entityDefs/` prüfen
