Aufgaben-Python/courses/go/13_http_server_und_routing/test_aufgabe.go

99 lines
3.4 KiB
Go

package main
import (
"fmt"
"net/http"
"net/http/httptest"
"strings"
)
// 🧪 GO 13 TESTSUITE: HTTP Web Server & Routing
func assertEquals[T comparable](actual, expected T, msg string) {
if actual != expected {
panic(fmt.Sprintf("❌ Test fehlgeschlagen: %s (Erwartet: '%v', Erhalten: '%v')", msg, expected, actual))
}
}
// TEST: TestHealthHandler - Prüft /health Endpoint
func TestHealthHandler() {
fmt.Println("=== RUN TestHealthHandler")
// 1. GET Request
reqGet := httptest.NewRequest(http.MethodGet, "/health", nil)
recGet := httptest.NewRecorder()
HealthHandler(recGet, reqGet)
assertEquals(recGet.Code, http.StatusOK, "Statuscode muss 200 OK sein")
assertEquals(strings.TrimSpace(recGet.Body.String()), "STATUS: UP", "Body muss 'STATUS: UP' enthalten")
// 2. POST Request (soll 405 liefern)
reqPost := httptest.NewRequest(http.MethodPost, "/health", nil)
recPost := httptest.NewRecorder()
HealthHandler(recPost, reqPost)
assertEquals(recPost.Code, http.StatusMethodNotAllowed, "POST auf /health muss 405 Method Not Allowed liefern")
fmt.Println("--- PASS: TestHealthHandler")
}
// TEST: TestEchoHandler - Prüft /echo Query-Parameter
func TestEchoHandler() {
fmt.Println("=== RUN TestEchoHandler")
// 1. Gültiger Query Parameter
reqValid := httptest.NewRequest(http.MethodGet, "/echo?msg=GolangCloud", nil)
recValid := httptest.NewRecorder()
EchoHandler(recValid, reqValid)
assertEquals(recValid.Code, http.StatusOK, "Statuscode muss 200 OK sein")
assertEquals(recValid.Body.String(), "ECHO: GolangCloud", "Body muss 'ECHO: GolangCloud' sein")
// 2. Fehlender Query Parameter
reqMissing := httptest.NewRequest(http.MethodGet, "/echo", nil)
recMissing := httptest.NewRecorder()
EchoHandler(recMissing, reqMissing)
assertEquals(recMissing.Code, http.StatusBadRequest, "Fehlender Parameter muss 400 Bad Request liefern")
fmt.Println("--- PASS: TestEchoHandler")
}
// TEST: TestUserProfileHandler - Prüft Pfad-Parameter /users/{username}
func TestUserProfileHandler() {
fmt.Println("=== RUN TestUserProfileHandler")
// 1. Gültiger Username
reqUser := httptest.NewRequest(http.MethodGet, "/users/gopher123", nil)
recUser := httptest.NewRecorder()
UserProfileHandler(recUser, reqUser)
assertEquals(recUser.Code, http.StatusOK, "Statuscode muss 200 OK sein")
assertEquals(recUser.Body.String(), "User Profile: gopher123", "Body muss 'User Profile: gopher123' sein")
// 2. Leerer Username
reqEmpty := httptest.NewRequest(http.MethodGet, "/users/", nil)
recEmpty := httptest.NewRecorder()
UserProfileHandler(recEmpty, reqEmpty)
assertEquals(recEmpty.Code, http.StatusBadRequest, "Leerer Username muss 400 Bad Request liefern")
fmt.Println("--- PASS: TestUserProfileHandler")
}
// TEST: TestRouterDispatch - Prüft ServeMux Routing
func TestRouterDispatch() {
fmt.Println("=== RUN TestRouterDispatch")
router := SetupAPIRouter()
req := httptest.NewRequest(http.MethodGet, "/health", nil)
rec := httptest.NewRecorder()
router.ServeHTTP(rec, req)
assertEquals(rec.Code, http.StatusOK, "Router muss /health an HealthHandler routen")
assertEquals(strings.TrimSpace(rec.Body.String()), "STATUS: UP", "Router-Response muss stimmen")
fmt.Println("--- PASS: TestRouterDispatch")
}
func main() {
fmt.Println("🧪 Starte Go 13 Testsuite...")
TestHealthHandler()
TestEchoHandler()
TestUserProfileHandler()
TestRouterDispatch()
fmt.Println("\n✅ Alle Tests in Go 13 erfolgreich bestanden!")
}