---
name: test_http_server
kind: function
lang: go
domain: core
version: "1.0.0"
purity: impure
signature: "func TestHTTPServer(t *testing.T, routes map[string]http.HandlerFunc) TestServer"
description: "Crea un httptest.Server con un ServeMux configurado desde un mapa de rutas. Registra t.Cleanup automaticamente. Retorna TestServer con URL, cliente y funcion de cierre."
tags: [testing, http, server, httptest, test_helper]
uses_functions: []
uses_types: [test_server_go_core]
returns: [test_server_go_core]
returns_optional: false
error_type: "error_go_core"
imports: ["net/http", "net/http/httptest", "testing"]
params:
  - name: t
    desc: "testing.T del test actual; usado para registrar Cleanup y llamar t.Helper()"
  - name: routes
    desc: "mapa de patron URL a HandlerFunc; cada entrada se registra en el ServeMux"
output: "TestServer con URL base del servidor, cliente HTTP preconfigurado y funcion Cleanup"
tested: true
tests:
  - "ruta registrada responde con el handler correcto"
  - "ruta no registrada devuelve 404"
  - "multiples rutas independientes"
test_file_path: "functions/core/test_http_server_test.go"
file_path: "functions/core/test_http_server.go"
---

## Ejemplo

```go
srv := TestHTTPServer(t, map[string]http.HandlerFunc{
    "/ping": func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("pong"))
    },
})

resp, err := srv.Client.Get(srv.URL + "/ping")
// resp.StatusCode == 200
```

## Notas

Funcion impura — crea un servidor de red real en un puerto aleatorio.
Usa t.Helper() para que los fallos apunten al test llamante.
El cleanup se registra dos veces: en t.Cleanup y en el campo Cleanup del TestServer,
para soportar tanto cleanup automatico como manual.
