Files
br c8df9d7651 erste module drin.
zwischenstand: Architektur aktualisiert, TOFU implementiert,
2026-10-01 22:22:13 +02:00

91 lines
2.5 KiB
Go

package traefik
import (
"errors"
"reflect"
"testing"
)
func nodeConfig(t *testing.T, host, name, domain string) *Configuration {
t.Helper()
c, err := FromLabels(host, map[string]string{
"traefik.enable": "true",
"traefik.http.routers." + name + ".rule": "Host(`" + domain + "`)",
"traefik.http.services." + name + ".loadbalancer.server.port": "80",
"traefik.http.middlewares." + name + "-gzip.compress": "true",
})
if err != nil {
t.Fatalf("FromLabels: %v", err)
}
return c
}
func TestMerge_Disjoint(t *testing.T) {
a := nodeConfig(t, "10.0.0.1", "a", "a.de")
b := nodeConfig(t, "10.0.0.2", "b", "b.de")
got, err := Merge(a, nil, &Configuration{}, b)
if err != nil {
t.Fatalf("unerwarteter Fehler: %v", err)
}
for _, name := range []string{"a", "b"} {
if got.HTTP.Routers[name] == nil || got.HTTP.Services[name] == nil || got.HTTP.Middlewares[name+"-gzip"] == nil {
t.Errorf("%s fehlt in %s", name, mustJSON(t, got))
}
}
if n := len(a.HTTP.Routers); n != 1 {
t.Errorf("Eingabe wurde verändert: %d Router in a", n)
}
}
func TestMerge_IdenticalDuplicateAllowed(t *testing.T) {
a := nodeConfig(t, "10.0.0.1", "a", "a.de")
again := nodeConfig(t, "10.0.0.1", "a", "a.de")
got, err := Merge(a, again)
if err != nil {
t.Fatalf("unerwarteter Fehler: %v", err)
}
if !reflect.DeepEqual(got, a) {
t.Errorf("erwartet %s, bekommen %s", mustJSON(t, a), mustJSON(t, got))
}
}
func TestMerge_Conflicts(t *testing.T) {
a := nodeConfig(t, "10.0.0.1", "a", "a.de")
sameNameOtherHost := nodeConfig(t, "10.0.0.2", "a", "a.de")
sameNameOtherRule := nodeConfig(t, "10.0.0.1", "a", "evil.de")
otherMiddleware := &Configuration{HTTP: &HTTPConfiguration{
Middlewares: map[string]Middleware{"a-gzip": {"compress": "false"}},
}}
tests := map[string]*Configuration{
"Service": sameNameOtherHost,
"Router": sameNameOtherRule,
"Middleware": otherMiddleware,
}
for name, other := range tests {
t.Run(name, func(t *testing.T) {
got, err := Merge(a, other)
if !errors.Is(err, ErrConflict) {
t.Fatalf("erwartet ErrConflict, bekommen %v", err)
}
if got != nil {
t.Errorf("bei Konflikt erwartet nil, bekommen %+v", got)
}
})
}
}
func TestMerge_Empty(t *testing.T) {
for _, in := range [][]*Configuration{nil, {nil}, {{}}, {{HTTP: &HTTPConfiguration{}}}} {
got, err := Merge(in...)
if err != nil {
t.Fatalf("unerwarteter Fehler: %v", err)
}
if got == nil || got.HTTP != nil {
t.Errorf("erwartet leere Konfiguration, bekommen %+v", got)
}
}
}