// E2E-Test-Beispiel (QA-01 Akzeptanzkriterium 1/Prüfung 2): echter // HTTP-Request über einen laufenden httptest.Server (TCP-Roundtrip), // nicht nur ein Funktionsaufruf im selben Prozess. package example import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestNormalizeHandler_RealHTTPRoundTrip(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(NormalizeHandler)) defer server.Close() body, _ := json.Marshal(normalizeRequest{Address: "Kunde@Beispiel.DE"}) resp, err := http.Post(server.URL, "application/json", bytes.NewReader(body)) if err != nil { t.Fatalf("post: %v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { t.Fatalf("status = %d, want 200", resp.StatusCode) } var out normalizeResponse if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { t.Fatalf("antwort dekodieren: %v", err) } if out.Normalized != "Kunde@beispiel.de" { t.Fatalf("got %q", out.Normalized) } } func TestNormalizeHandler_InvalidAddressReturns400(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(NormalizeHandler)) defer server.Close() body, _ := json.Marshal(normalizeRequest{Address: "keine-gueltige-adresse"}) resp, err := http.Post(server.URL, "application/json", bytes.NewReader(body)) if err != nil { t.Fatalf("post: %v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusBadRequest { t.Fatalf("status = %d, want 400", resp.StatusCode) } }