750b7abcd5
- .claude/CLAUDE.md - .claude/agents/fn-recopilador/SKILL.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - bash/functions/infra/build_cpp_windows.sh - cpp/CMakeLists.txt - cpp/PATTERNS.md - cpp/framework/app_base.cpp - cpp/framework/app_base.h - dev/issues/README.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
184 lines
5.0 KiB
Go
184 lines
5.0 KiB
Go
package infra
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestGenerateTraefikDynamic(t *testing.T) {
|
|
t.Run("render con auth y gzip", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "registry-api",
|
|
Domain: "registry.organic-machine.com",
|
|
UpstreamURL: "http://registry-api:8420",
|
|
BasicAuthLine: "lucas:$2a$10$hashedpassword",
|
|
EnableGzip: true,
|
|
CertResolver: "letsencrypt",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
checks := []string{
|
|
"http:",
|
|
" routers:",
|
|
" registry-api-http:",
|
|
` rule: "Host(` + "`registry.organic-machine.com`" + `)"`,
|
|
` - "http"`,
|
|
` - "registry-api-redirect"`,
|
|
` service: "registry-api-service"`,
|
|
" registry-api-https:",
|
|
` - "https"`,
|
|
` - "registry-api-auth"`,
|
|
` - "registry-api-gzip"`,
|
|
" certResolver: letsencrypt",
|
|
" services:",
|
|
" registry-api-service:",
|
|
` - url: "http://registry-api:8420"`,
|
|
" middlewares:",
|
|
" registry-api-redirect:",
|
|
` scheme: "https"`,
|
|
" registry-api-auth:",
|
|
" basicAuth:",
|
|
" users:",
|
|
` - "lucas:$2a$10$hashedpassword"`,
|
|
" registry-api-gzip:",
|
|
" compress: true",
|
|
}
|
|
for _, want := range checks {
|
|
if !strings.Contains(got, want) {
|
|
t.Errorf("missing %q in output:\n%s", want, got)
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("render sin auth", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "myapp",
|
|
Domain: "myapp.example.com",
|
|
UpstreamURL: "http://myapp:9000",
|
|
BasicAuthLine: "",
|
|
EnableGzip: true,
|
|
CertResolver: "letsencrypt",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
if strings.Contains(got, "basicAuth") {
|
|
t.Errorf("expected no basicAuth when BasicAuthLine is empty, got:\n%s", got)
|
|
}
|
|
if strings.Contains(got, "myapp-auth") {
|
|
t.Errorf("expected no myapp-auth middleware when BasicAuthLine is empty, got:\n%s", got)
|
|
}
|
|
if !strings.Contains(got, "myapp-gzip") {
|
|
t.Errorf("expected myapp-gzip middleware, got:\n%s", got)
|
|
}
|
|
// redirect should always be present
|
|
if !strings.Contains(got, "myapp-redirect") {
|
|
t.Errorf("expected myapp-redirect middleware, got:\n%s", got)
|
|
}
|
|
})
|
|
|
|
t.Run("render sin gzip", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "api",
|
|
Domain: "api.example.com",
|
|
UpstreamURL: "http://api:8080",
|
|
BasicAuthLine: "admin:$2a$10$hash",
|
|
EnableGzip: false,
|
|
CertResolver: "letsencrypt",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
if strings.Contains(got, "api-gzip") {
|
|
t.Errorf("expected no api-gzip middleware when EnableGzip is false, got:\n%s", got)
|
|
}
|
|
if strings.Contains(got, "compress:") {
|
|
t.Errorf("expected no compress section when EnableGzip is false, got:\n%s", got)
|
|
}
|
|
if !strings.Contains(got, "api-auth") {
|
|
t.Errorf("expected api-auth middleware when BasicAuthLine is set, got:\n%s", got)
|
|
}
|
|
})
|
|
|
|
t.Run("certResolver custom", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "svc",
|
|
Domain: "svc.example.com",
|
|
UpstreamURL: "http://svc:7000",
|
|
EnableGzip: false,
|
|
CertResolver: "myresolver",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
if !strings.Contains(got, "certResolver: myresolver") {
|
|
t.Errorf("expected certResolver: myresolver, got:\n%s", got)
|
|
}
|
|
})
|
|
|
|
t.Run("certResolver vacio usa letsencrypt por defecto", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "svc",
|
|
Domain: "svc.example.com",
|
|
UpstreamURL: "http://svc:7000",
|
|
CertResolver: "",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
if !strings.Contains(got, "certResolver: letsencrypt") {
|
|
t.Errorf("expected certResolver: letsencrypt as default, got:\n%s", got)
|
|
}
|
|
})
|
|
|
|
t.Run("snapshot YAML completo replica patron registry_api", func(t *testing.T) {
|
|
cfg := TraefikDynamicConfig{
|
|
Name: "registry-api",
|
|
Domain: "registry.organic-machine.com",
|
|
UpstreamURL: "http://registry-api:8420",
|
|
BasicAuthLine: "PLACEHOLDER_BASICAUTH_LINE",
|
|
EnableGzip: true,
|
|
CertResolver: "letsencrypt",
|
|
}
|
|
got := GenerateTraefikDynamic(cfg)
|
|
|
|
expected := `http:
|
|
routers:
|
|
registry-api-http:
|
|
rule: "Host(` + "`registry.organic-machine.com`" + `)"
|
|
entryPoints:
|
|
- "http"
|
|
middlewares:
|
|
- "registry-api-redirect"
|
|
service: "registry-api-service"
|
|
|
|
registry-api-https:
|
|
rule: "Host(` + "`registry.organic-machine.com`" + `)"
|
|
entryPoints:
|
|
- "https"
|
|
middlewares:
|
|
- "registry-api-auth"
|
|
- "registry-api-gzip"
|
|
service: "registry-api-service"
|
|
tls:
|
|
certResolver: letsencrypt
|
|
|
|
services:
|
|
registry-api-service:
|
|
loadBalancer:
|
|
servers:
|
|
- url: "http://registry-api:8420"
|
|
|
|
middlewares:
|
|
registry-api-redirect:
|
|
redirectScheme:
|
|
scheme: "https"
|
|
registry-api-auth:
|
|
basicAuth:
|
|
users:
|
|
- "PLACEHOLDER_BASICAUTH_LINE"
|
|
registry-api-gzip:
|
|
compress: true
|
|
`
|
|
if got != expected {
|
|
t.Errorf("snapshot mismatch.\nGOT:\n%s\nWANT:\n%s", got, expected)
|
|
}
|
|
})
|
|
}
|