# Test – Vollständige Test-Suite

Führt Backend-Tests (API + Logs) und Frontend-Tests (Playwright) durch.
Claude Code schreibt, führt aus und korrigiert bis alle Tests grün sind.

## Workflow für neue Features

Nach jeder Implementierung:
1. Backend-Tests schreiben und ausführen
2. Frontend-Tests schreiben und ausführen  
3. Logs auf Fehler prüfen
4. Alle grün → committen

---

## TEIL 1: Backend API-Tests (schnell, immer zuerst)

### 1.1 Login + Token holen
```bash
TOKEN=$(curl -s -X POST https://dev.mitai.jinkendo.de/api/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"email\":\"$TEST_EMAIL\",\"pin\":\"$TEST_PASSWORD\"}" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('token','KEIN_TOKEN'))")
echo "Token: ${TOKEN:0:30}..."
```

### 1.2 Basis-Endpoints prüfen
```bash
# Version
curl -sf https://dev.mitai.jinkendo.de/api/version \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print('Version:', d.get('app_version'), '| DB:', d.get('db_schema_version'))"

# Auth Status
curl -sf https://dev.mitai.jinkendo.de/api/auth/status \
  && echo "Auth OK" || echo "Auth FEHLER"

# Stats (mit Token)
curl -sf https://dev.mitai.jinkendo.de/api/stats \
  -H "X-Auth-Token: $TOKEN" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print('Stats OK:', list(d.keys())[:5])"
```

### 1.3 CRUD-Test für neues Modul
Template für jeden neuen Router:
```bash
# CREATE
ID=$(curl -s -X POST https://dev.mitai.jinkendo.de/api/MODUL \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: $TOKEN" \
  -d '{"date":"2026-01-01","FELD":"WERT"}' \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id','FEHLER'))")
echo "CREATE: ID=$ID"

# READ
curl -sf https://dev.mitai.jinkendo.de/api/MODUL?limit=5 \
  -H "X-Auth-Token: $TOKEN" \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print('READ: Einträge:', len(d))"

# DELETE (Test-Eintrag aufräumen)
curl -s -X DELETE https://dev.mitai.jinkendo.de/api/MODUL/$ID \
  -H "X-Auth-Token: $TOKEN" \
  && echo "DELETE OK" || echo "DELETE FEHLER"
```

### 1.4 Auth-Schutz prüfen
```bash
# Endpoint OHNE Token muss 401 zurückgeben
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://dev.mitai.jinkendo.de/api/stats)
[ "$STATUS" = "401" ] && echo "Auth-Schutz OK (401)" || echo "WARNUNG: Auth-Schutz fehlt! ($STATUS)"
```

### 1.5 Admin-Endpoint prüfen
```bash
# Admin-Endpoint mit normalem Token muss 403 zurückgeben
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
  https://dev.mitai.jinkendo.de/api/admin/profiles \
  -H "X-Auth-Token: $TOKEN")
echo "Admin-Schutz: $STATUS (erwartet 403 für nicht-Admin)"
```

---

## TEIL 2: Backend Logs prüfen

### 2.1 Letzte Logs auf Fehler prüfen
```bash
ssh pi "docker logs dev-mitai-api --tail 50 2>&1 | grep -i 'error\|exception\|traceback\|warning' | head -20"
```

### 2.2 Nach Test-Requests: Logs prüfen
```bash
# Direkt nach API-Tests ausführen
ssh pi "docker logs dev-mitai-api --tail 20 --timestamps 2>&1"
```

### 2.3 Alle neuen Endpoints im Log sichtbar?
```bash
# Prüft ob Router korrekt registriert
ssh pi "docker logs dev-mitai-api 2>&1 | grep 'router\|route\|endpoint' | head -10"
```

### 2.4 DB-Verbindung gesund?
```bash
ssh pi "docker exec dev-mitai-postgres pg_isready -U mitai_dev && echo 'DB OK'"
```

### 2.5 Neue Tabellen vorhanden?
```bash
ssh pi "docker exec dev-mitai-postgres psql -U mitai_dev -d mitai_dev -c '\dt' 2>/dev/null | grep -E 'TABELLEN_NAME'"
```

---

## TEIL 3: Frontend Playwright-Tests

### 3.1 Alle Smoke Tests
```bash
npx playwright test
```

### 3.2 Nur neues Feature testen
```bash
npx playwright test --grep "FEATURE_NAME"
```

### 3.3 Mit sichtbarem Browser
```bash
npx playwright test --headed
```

### 3.4 Screenshot bei Fehler ansehen
```bash
start test-results\TESTNAME\test-failed-1.png
```

---

## TEIL 4: Tests schreiben

### Backend-Test Template (in test-Abschnitt einfügen)
```bash
# Für jeden neuen Endpoint:
echo "=== Test: MODUL_NAME ==="
TOKEN=$(curl -s -X POST https://dev.mitai.jinkendo.de/api/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"email\":\"$TEST_EMAIL\",\"pin\":\"$TEST_PASSWORD\"}" \
  | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))")

# GET Test
curl -sf https://dev.mitai.jinkendo.de/api/MODUL \
  -H "X-Auth-Token: $TOKEN" \
  && echo "GET OK" || echo "GET FEHLER"

# POST Test
curl -s -X POST https://dev.mitai.jinkendo.de/api/MODUL \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: $TOKEN" \
  -d '{"date":"2026-01-01"}' \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print('POST OK, id:', d.get('id'))"

# Auth-Schutz
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://dev.mitai.jinkendo.de/api/MODUL)
[ "$STATUS" = "401" ] && echo "Auth-Schutz OK" || echo "Auth-Schutz FEHLER ($STATUS)"
```

### Frontend-Test Template (in dev-smoke-test.spec.js)
```javascript
test('MODUL: Seite lädt und Grundfunktion', async ({ page }) => {
  await login(page);
  
  // Navigation
  await page.click('text=NAV_TEXT');
  await page.waitForLoadState('networkidle');
  await expect(page.locator('.spinner')).toHaveCount(0, { timeout: 10000 });
  
  // Formular ausfüllen
  await page.fill('input[name="FELD"]', 'TESTWERT');
  await page.click('button:has-text("Speichern")');
  
  // Ergebnis prüfen
  await expect(page.locator('text=gespeichert')).toBeVisible({ timeout: 5000 });
  await page.screenshot({ path: 'screenshots/MODUL-test.png' });
  console.log('MODUL OK');
});
```

---

## TEIL 5: Vollständiger Test-Lauf (vor jedem Deploy)

```bash
echo "=== BACKEND TESTS ===" && \
TOKEN=$(curl -s -X POST https://dev.mitai.jinkendo.de/api/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"email\":\"$TEST_EMAIL\",\"pin\":\"$TEST_PASSWORD\"}" \
  | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))") && \
curl -sf https://dev.mitai.jinkendo.de/api/version | python3 -c "import sys,json; d=json.load(sys.stdin); print('Version:', d.get('app_version'))" && \
curl -sf https://dev.mitai.jinkendo.de/api/stats -H "X-Auth-Token: $TOKEN" > /dev/null && echo "Stats OK" && \
echo "" && \
echo "=== LOGS PRUEFEN ===" && \
ssh pi "docker logs dev-mitai-api --tail 20 2>&1 | grep -i 'error\|exception' | head -5 || echo 'Keine Fehler in Logs'" && \
echo "" && \
echo "=== FRONTEND TESTS ===" && \
npx playwright test && \
echo "" && \
echo "=== ALLE TESTS BESTANDEN ==="
```

---

## Credentials setzen (einmalig pro Session)
```bash
$env:TEST_EMAIL="lars@stommer.com"
$env:TEST_PASSWORD="5112"
```

---

## Prod-Schutz
Tests laufen AUSSCHLIESSLICH gegen:
- https://dev.mitai.jinkendo.de
- http://192.168.2.49:8099

NIEMALS gegen:
- https://mitai.jinkendo.de
- http://192.168.2.49:8002
