# Integration Test Environment

> **Letzte Aktualisierung:** 2026-02-04
> **Status:** Produktiv
> **Maintainer:** DevOps Team

---

## Inhaltsverzeichnis

1. [Uebersicht](#1-uebersicht)
2. [Quick Start (Lokal)](#2-quick-start-lokal)
3. [Services](#3-services)
4. [CI/CD Integration](#4-cicd-integration)
5. [Konfiguration](#5-konfiguration)
6. [Troubleshooting](#6-troubleshooting)

---

## 1. Uebersicht

Die Integration-Test-Umgebung ermoeglicht vollstaendige End-to-End-Tests aller Services in einer isolierten Docker-Compose-Umgebung. Sie wird sowohl lokal als auch in der CI/CD-Pipeline verwendet.

### Architektur

```
┌─────────────────────────────────────────────────────────────────────┐
│                    docker-compose.test.yml                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────────────┐  │
│  │ postgres-test│    │  valkey-test │    │     mailpit-test     │  │
│  │  Port 55432  │    │  Port 56379  │    │  Web: 58025          │  │
│  │  PostgreSQL  │    │  Redis/Valkey│    │  SMTP: 51025         │  │
│  └──────────────┘    └──────────────┘    └──────────────────────┘  │
│         │                   │                      │                │
│         ▼                   ▼                      ▼                │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                   consent-service-test                       │   │
│  │                       Port 58081                             │   │
│  │                   Go Authentication Service                  │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              │                                      │
│                              ▼                                      │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                      backend-test                            │   │
│  │                       Port 58000                             │   │
│  │                   Python FastAPI Backend                     │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘
```

### Vorteile

- **Isolation:** Keine Konflikte mit Produktions- oder Entwicklungs-Datenbanken
- **Reproduzierbarkeit:** Identische Umgebung lokal und in CI/CD
- **Health Checks:** Automatisches Warten auf Service-Verfuegbarkeit
- **Cleanup:** Automatisches Entfernen aller Volumes nach Tests

---

## 2. Quick Start (Lokal)

### Test-Umgebung starten

```bash
# 1. Test-Umgebung starten
docker compose -f docker-compose.test.yml up -d

# 2. Warten bis alle Services healthy sind
docker compose -f docker-compose.test.yml ps

# 3. Health-Status pruefen (alle sollten "healthy" zeigen)
watch docker compose -f docker-compose.test.yml ps
```

### Integration Tests ausfuehren

```bash
# In das Backend-Verzeichnis wechseln
cd backend

# Virtual Environment aktivieren (falls vorhanden)
source venv/bin/activate

# Integration Tests ausfuehren
export SKIP_INTEGRATION_TESTS=false
pytest tests/test_integration/ -v
```

### Services einzeln testen

```bash
# Datenbank-Verbindung testen
psql -h localhost -p 55432 -U breakpilot -d breakpilot_test -c "SELECT 1"

# Consent Service Health Check
curl -f http://localhost:58081/health

# Backend Health Check
curl -f http://localhost:58000/health

# Mailpit Web UI
open http://localhost:58025
```

### Aufraeumen

```bash
# Alle Container stoppen und Volumes loeschen
docker compose -f docker-compose.test.yml down -v
```

---

## 3. Services

### Port-Strategie

| Service | Test-Port (extern) | Container-Port | Prod-Port |
|---------|-------------------|----------------|-----------|
| PostgreSQL | 55432 | 5432 | 5432 |
| Valkey/Redis | 56379 | 6379 | 6379 |
| Consent Service | 58081 | 8081 | 8081 |
| Backend | 58000 | 8000 | 8000 |
| Mailpit Web | 58025 | 8025 | - |
| Mailpit SMTP | 51025 | 1025 | - |

### Service-Details

#### postgres-test

- **Image:** `postgres:16-alpine`
- **Credentials:** `breakpilot:breakpilot_test@breakpilot_test`
- **Health Check:** `pg_isready -U breakpilot -d breakpilot_test`

#### valkey-test

- **Image:** `valkey/valkey:7-alpine`
- **Health Check:** `valkey-cli ping`
- **Hinweis:** Ersetzt Redis fuer bessere ARM64-Kompatibilitaet

#### consent-service-test

- **Build:** `./consent-service/Dockerfile`
- **Health Check:** `GET /health`
- **Abhaengigkeiten:** postgres-test, valkey-test

#### backend-test

- **Build:** `./backend/Dockerfile`
- **Health Check:** `GET /health`
- **Abhaengigkeiten:** postgres-test, valkey-test, consent-service-test

#### mailpit-test

- **Image:** `axllent/mailpit:latest`
- **Web UI:** http://localhost:58025
- **SMTP:** localhost:51025
- **Zweck:** E-Mail-Testing ohne echten SMTP-Server

---

## 4. CI/CD Integration

### Woodpecker Pipeline

Die Integration-Tests laufen automatisch bei jedem Push/PR zu `main` oder `develop`:

```yaml
# .woodpecker/main.yml
integration-tests:
  image: docker:27-cli
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  commands:
    - docker compose -f docker-compose.test.yml up -d
    - # Wait for services...
    - docker compose -f docker-compose.test.yml exec -T backend-test \
        pytest tests/test_integration/ -v
    - docker compose -f docker-compose.test.yml down -v
  when:
    - event: [push, pull_request]
      branch: [main, develop]
```

### Pipeline-Ablauf

1. **Unit Tests** (test-go-*, test-python-*) laufen zuerst
2. **Integration Tests** starten Docker Compose Umgebung
3. **Report** sendet alle Ergebnisse ans Test Dashboard

### Manueller Pipeline-Trigger

```bash
# Via Gitea/Woodpecker UI oder:
curl -X POST "https://macmini:4431/api/repos/pilotadmin/breakpilot-pwa/pipelines" \
  -H "Authorization: Bearer $WOODPECKER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"branch":"main"}'
```

---

## 5. Konfiguration

### Environment Variables

Die Test-Umgebung konfiguriert automatisch alle noetigen Variablen:

| Variable | Wert in Test-Umgebung |
|----------|----------------------|
| `DATABASE_URL` | `postgresql://breakpilot:breakpilot_test@postgres-test:5432/breakpilot_test` |
| `CONSENT_SERVICE_URL` | `http://consent-service-test:8081` |
| `VALKEY_URL` | `redis://valkey-test:6379` |
| `REDIS_URL` | `redis://valkey-test:6379` |
| `JWT_SECRET` | `test-jwt-secret-for-integration-tests` |
| `ENVIRONMENT` | `test` |
| `SMTP_HOST` | `mailpit-test` |
| `SMTP_PORT` | `1025` |

### conftest.py Integration

Das `backend/tests/conftest.py` erkennt automatisch die Integration-Umgebung:

```python
# Wird aktiviert wenn SKIP_INTEGRATION_TESTS=false
IS_INTEGRATION_ENV = os.environ.get("SKIP_INTEGRATION_TESTS", "").lower() == "false"

if IS_INTEGRATION_ENV:
    os.environ.setdefault("DATABASE_URL",
        "postgresql://breakpilot:breakpilot_test@postgres-test:5432/breakpilot_test")
    # ... weitere Container-URLs
```

---

## 6. Troubleshooting

### Service startet nicht

```bash
# Logs eines spezifischen Services anzeigen
docker compose -f docker-compose.test.yml logs consent-service-test --tail=100

# Alle Logs anzeigen
docker compose -f docker-compose.test.yml logs
```

### Health Check schlaegt fehl

```bash
# Container-Status pruefen
docker compose -f docker-compose.test.yml ps

# In Container einloggen
docker compose -f docker-compose.test.yml exec backend-test bash

# Health-Endpoint manuell pruefen
docker compose -f docker-compose.test.yml exec backend-test curl -v http://localhost:8000/health
```

### Datenbank-Verbindungsprobleme

```bash
# Datenbank-Container pruefen
docker compose -f docker-compose.test.yml exec postgres-test pg_isready -U breakpilot

# Datenbank-Logs
docker compose -f docker-compose.test.yml logs postgres-test
```

### Port-Konflikte

Falls Ports bereits belegt sind:

```bash
# Pruefen welcher Prozess den Port belegt
lsof -i :55432

# Container mit anderen Ports starten (manuell .yml anpassen)
# Oder: Bestehende Container stoppen
docker compose -f docker-compose.test.yml down
```

### Tests finden keine Services

Stellen Sie sicher, dass:

1. `SKIP_INTEGRATION_TESTS=false` gesetzt ist
2. Tests innerhalb des Docker-Netzwerks laufen
3. Container-Namen (nicht localhost) verwendet werden

```bash
# Innerhalb des Backend-Containers:
export SKIP_INTEGRATION_TESTS=false
pytest tests/test_integration/ -v
```

### Cleanup bei Problemen

```bash
# Komplettes Aufräumen
docker compose -f docker-compose.test.yml down -v --remove-orphans

# Auch Netzwerke entfernen
docker network prune -f

# Alle Test-Container entfernen
docker rm -f $(docker ps -a -q --filter "name=breakpilot-*-test") 2>/dev/null || true
```

---

## Anhang: Test-Verzeichnisstruktur

```
backend/tests/
├── conftest.py              # Pytest Konfiguration mit Integration-Detection
├── test_consent_client.py   # Unit Tests (Mock-basiert)
├── test_gdpr_api.py         # Unit Tests
└── test_integration/        # Integration Tests (benoetigen Docker Compose)
    ├── __init__.py
    ├── conftest.py          # Integration-spezifische Fixtures
    ├── test_consent_flow.py # E2E Consent Workflow
    ├── test_auth_flow.py    # E2E Auth Workflow
    └── test_email_flow.py   # E2E E-Mail Tests (Mailpit)
```

---

*Generiert am 2026-02-04 von Claude Code*
