- .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
6.6 KiB
6.6 KiB
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:
- Backend-Tests schreiben und ausführen
- Frontend-Tests schreiben und ausführen
- Logs auf Fehler prüfen
- Alle grün → committen
TEIL 1: Backend API-Tests (schnell, immer zuerst)
1.1 Login + Token holen
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
# 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:
# 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
# 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
# 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
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
# 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?
# 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?
ssh pi "docker exec dev-mitai-postgres pg_isready -U mitai_dev && echo 'DB OK'"
2.5 Neue Tabellen vorhanden?
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
npx playwright test
3.2 Nur neues Feature testen
npx playwright test --grep "FEATURE_NAME"
3.3 Mit sichtbarem Browser
npx playwright test --headed
3.4 Screenshot bei Fehler ansehen
start test-results\TESTNAME\test-failed-1.png
TEIL 4: Tests schreiben
Backend-Test Template (in test-Abschnitt einfügen)
# 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)
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)
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)
$env:TEST_EMAIL="lars@stommer.com"
$env:TEST_PASSWORD="5112"
Prod-Schutz
Tests laufen AUSSCHLIESSLICH gegen:
NIEMALS gegen: