- .gitignore: .claude/docs, rules, commands tracken; settings.local weiter ignorieren - DOCUMENTATION.md: verbindliche Ablage functional/technical/working/issues - .claude/README.md: Agent-Einstieg; GITEA_ISSUES_INDEX aus MCP (Stand 2026-04-08) - Arbeitspapiere von docs/ nach .claude/docs/working/ verschoben - docs/MEMBERSHIP_SYSTEM.md als Stub; kanonisch technical/MEMBERSHIP_SYSTEM.md - CLAUDE.md Pflichtlektüre und Links angepasst; docs/README.md vereinfacht Made-with: Cursor
227 lines
6.6 KiB
Markdown
227 lines
6.6 KiB
Markdown
# 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
|