--- type: Guide status: ACTIVE owner: Backend Developer tags: [testing, postman, backend, api] --- # 🧪 Testanleitung: Ping-Service & Gateway mit Postman Diese Anleitung beschreibt, wie die Backend-Services (Gateway, Ping-Service) und die Infrastruktur (Keycloak, DB) isoliert vom Frontend getestet werden können. **Voraussetzungen:** 1. **Infrastruktur läuft:** `docker compose --profile infra up -d` (Postgres, Keycloak, Redis, Consul). 2. **Backend läuft:** `docker compose --profile backend up -d` (Gateway, Ping-Service). 3. **Postman** ist installiert. --- ## 1. Vorbereitung: Keycloak User & Client Damit wir testen können, brauchen wir einen User und einen Client in Keycloak, um uns ein Token zu holen. * **URL:** `http://localhost:8180` (oder Port aus `docker-compose logs keycloak`) * **Admin Login:** `kc-admin` / `kc-password` * **Realm:** Wähle oben links `meldestelle` aus (wurde beim Start importiert). **Check:** * **User:** Der Standard-Admin User `admin` hat bereits die notwendige Rolle `MELD_USER`. * **Client:** Es gibt einen dedizierten Test-Client `postman-client`. * Client ID: `postman-client` * Client Secret: `postman-secret-123` * Access Type: `confidential` * Direct Access Grants: `Enabled` --- ## 2. Postman Collection einrichten Erstelle eine neue Collection "Meldestelle Ping Test". ### A. Variablen (Environment) Setze folgende Variablen in Postman (Environment "Local Docker"): * `gateway_url`: `http://localhost:8081` * `auth_url`: `http://localhost:8180/realms/meldestelle/protocol/openid-connect/token` * `client_id`: `postman-client` * `client_secret`: `postman-secret-123` * `username`: `admin` * `password`: `Change_Me_In_Production!` --- ## 3. Test-Szenarien Wir testen nun die verschiedenen Endpunkte und Sicherheitsstufen. ### Szenario 1: Public Endpoints (Ohne Login) *Diese Requests müssen **ohne** Token funktionieren.* **1.1 Simple Ping** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/simple` * **Auth:** No Auth * **Erwartetes Ergebnis:** * Status: `200 OK` * Body: `{"status": "pong", "service": "ping-service", ...}` * *Bedeutung:* Gateway routet korrekt, Service ist erreichbar, DB-Schreibzugriff (Simple Ping speichert was) klappt. **1.2 Health Check** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/health` * **Auth:** No Auth * **Erwartetes Ergebnis:** * Status: `200 OK` * Body: `{"status": "up", "healthy": true, ...}` **1.3 Public Ping** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/public` * **Auth:** No Auth * **Erwartetes Ergebnis:** `200 OK` --- ### Szenario 2: Security Check (Negativ-Test) *Wir versuchen, auf geschützte Bereiche zuzugreifen, ohne eingeloggt zu sein.* **2.1 Secure Ping (Unauthenticated)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/secure` * **Auth:** No Auth * **Erwartetes Ergebnis:** * Status: `401 Unauthorized` * *Bedeutung:* Gateway oder Service blockt den Request korrekt ab. **2.2 Sync Ping (Unauthenticated)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/sync` * **Auth:** No Auth * **Erwartetes Ergebnis:** * Status: `401 Unauthorized` (sofern Sync auch geschützt ist). --- ### Szenario 3: Authenticated Endpoints (Mit Token) *Jetzt holen wir uns ein Token und testen die geschützten Bereiche.* **3.1 Token holen (Login)** * In Postman: Tab "Authorization" -> Type "OAuth 2.0". * Grant Type: `Password Credentials` * Access Token URL: `{{auth_url}}` * Client ID: `{{client_id}}` * Client Secret: `{{client_secret}}` * Username: `{{username}}` * Password: `{{password}}` * Klick auf "Get New Access Token". * Klick auf "Use Token". **3.2 Secure Ping (Authenticated)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/secure` * **Auth:** Inherit from parent (oder OAuth 2.0 mit dem Token). * **Erwartetes Ergebnis:** * Status: `200 OK` * Body: `{"status": "secure-pong", ...}` * *Bedeutung:* Token ist gültig, Signatur passt, Rolle `MELD_USER` wurde erkannt. **3.3 Sync Ping (Authenticated)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/sync?lastSyncTimestamp=0` * **Auth:** OAuth 2.0 (Token) * **Erwartetes Ergebnis:** * Status: `200 OK` * Body: `[ ... Liste von Events ... ]` * *Bedeutung:* Delta-Sync funktioniert. --- ### Szenario 4: Resilience (Circuit Breaker) **4.1 Enhanced Ping (Normal)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/enhanced` * **Erwartetes Ergebnis:** `200 OK` **4.2 Enhanced Ping (Simulation Failure)** * **Method:** `GET` * **URL:** `{{gateway_url}}/api/ping/enhanced?simulate=true` * **Wiederhole:** Sende den Request mehrmals schnell hintereinander. * **Erwartetes Ergebnis:** * Manchmal `500 Error` (Simulation). * Nach einigen Fehlern: `200 OK` aber mit `status: "fallback"` und `circuitBreakerState: "OPEN"`. * *Bedeutung:* Resilience4j hat den Fehler erkannt und den Circuit Breaker geöffnet -> Fallback-Methode greift. --- ## Zusammenfassung der Checkliste | Test | URL | Auth | Erwartet | | :--- | :--- | :--- | :--- | | **Connectivity** | `/api/ping/simple` | Nein | 200 OK | | **Health** | `/api/ping/health` | Nein | 200 OK | | **Security Block** | `/api/ping/secure` | Nein | 401 Unauthorized | | **Auth Login** | (Keycloak Token) | - | Token erhalten | | **Security Access** | `/api/ping/secure` | Ja (Token) | 200 OK | | **Sync** | `/api/ping/sync` | Ja (Token) | 200 OK (Liste) | | **Resilience** | `/api/ping/enhanced?simulate=true` | Nein | Fallback Response |