feat(infra): auto-commit con 56 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 14:22:55 +02:00
parent c1071a82b3
commit 32c7336bf6
56 changed files with 5307 additions and 100 deletions
@@ -0,0 +1,103 @@
"""Tests para render_caddyfile."""
from render_caddyfile import render_caddyfile
HEADER = (
"# Generado por render_caddyfile_py_infra — NO editar a mano. "
"Fuente: apps/local_hub/local_services.yaml\n"
)
def test_golden_dos_servicios_ordenados():
services = [
{"subdomain": "metabase", "port": 3030},
{"subdomain": "grafana", "port": 3000},
]
result = render_caddyfile(services)
expected = (
HEADER
+ "http://grafana.localhost {\n"
+ " reverse_proxy 127.0.0.1:3000\n"
+ "}\n"
+ "http://metabase.localhost {\n"
+ " reverse_proxy 127.0.0.1:3030\n"
+ "}\n"
)
assert result == expected
# Orden alfabetico: grafana antes que metabase pese al orden de entrada.
assert result.index("grafana.localhost") < result.index("metabase.localhost")
# Termina con un unico newline.
assert result.endswith("}\n")
assert not result.endswith("\n\n")
def test_dashboard_va_primero():
services = [{"subdomain": "metabase", "port": 3030}]
dashboard = {"subdomain": "home", "port": 8585}
result = render_caddyfile(services, dashboard=dashboard)
expected = (
HEADER
+ "http://home.localhost {\n"
+ " reverse_proxy 127.0.0.1:8585\n"
+ "}\n"
+ "http://metabase.localhost {\n"
+ " reverse_proxy 127.0.0.1:3030\n"
+ "}\n"
)
assert result == expected
# El dashboard aparece antes que cualquier servicio.
assert result.index("home.localhost") < result.index("metabase.localhost")
def test_lista_vacia_solo_cabecera():
result = render_caddyfile([])
assert result == HEADER
def test_servicio_sin_port_se_ignora():
services = [
{"subdomain": "valido", "port": 9000},
{"subdomain": "sin_port"},
]
result = render_caddyfile(services)
expected = (
HEADER
+ "http://valido.localhost {\n"
+ " reverse_proxy 127.0.0.1:9000\n"
+ "}\n"
)
assert result == expected
assert "sin_port" not in result
def test_servicio_sin_subdomain_se_ignora():
services = [
{"subdomain": "valido", "port": 9000},
{"port": 1234},
]
result = render_caddyfile(services)
assert "1234" not in result
assert result.count("reverse_proxy") == 1
def test_rewrite_host_emite_header_up():
services = [{"subdomain": "jupyter", "port": 8888, "rewrite_host": True}]
result = render_caddyfile(services)
expected = (
HEADER
+ "http://jupyter.localhost {\n"
+ " reverse_proxy 127.0.0.1:8888 {\n"
+ " header_up Host 127.0.0.1:8888\n"
+ " }\n"
+ "}\n"
)
assert result == expected
def test_rewrite_host_ausente_o_falso_no_reescribe():
# Sin la clave -> bloque simple.
assert "header_up" not in render_caddyfile([{"subdomain": "a", "port": 1}])
# Con rewrite_host falsy -> bloque simple.
assert "header_up" not in render_caddyfile(
[{"subdomain": "a", "port": 1, "rewrite_host": False}]
)