package infra import ( "net/http" "net/http/httptest" "testing" "time" ) func TestHealthCheckHTTP(t *testing.T) { t.Run("retorna nil cuando el servidor responde 200", func(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })) defer srv.Close() err := HealthCheckHTTP(srv.URL, 5, 100) if err != nil { t.Errorf("se esperaba nil, got: %v", err) } }) t.Run("retorna error si el timeout se agota", func(t *testing.T) { // Servidor que nunca responde 200 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusServiceUnavailable) })) defer srv.Close() err := HealthCheckHTTP(srv.URL, 1, 200) if err == nil { t.Error("se esperaba error por timeout") } }) t.Run("respeta el intervalo entre intentos", func(t *testing.T) { attempts := 0 srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { attempts++ if attempts >= 3 { w.WriteHeader(http.StatusOK) } else { w.WriteHeader(http.StatusServiceUnavailable) } })) defer srv.Close() start := time.Now() err := HealthCheckHTTP(srv.URL, 5, 150) elapsed := time.Since(start) if err != nil { t.Errorf("se esperaba nil despues de 3 intentos, got: %v", err) } // Con 2 intervalos de 150ms debe haber pasado al menos 250ms if elapsed < 250*time.Millisecond { t.Errorf("elapsed %v demasiado rapido, se esperaban al menos 250ms", elapsed) } if attempts < 3 { t.Errorf("se esperaban al menos 3 intentos, got %d", attempts) } }) }