maidn-cli/internal/cloudflare/tunnel_test.go

72 lines
2.4 KiB
Go

package cloudflare
import (
"os"
"path/filepath"
"testing"
)
func TestStoredTunnelStartsWithoutPublicIngress(t *testing.T) {
stored := StoredTunnel{Credentials: Credentials{AccountTag: "account", TunnelSecret: "secret", TunnelID: "tunnel"}, Config: NewConfig("tunnel")}
values, err := stored.Values()
if err != nil {
t.Fatal(err)
}
parsed, present, err := ParseStoredTunnel(values)
if err != nil || !present || len(parsed.Config.Ingress) != 1 || parsed.Config.Ingress[0].Service != "http_status:404" {
t.Fatal("new tunnel state must contain only the terminal ingress rule")
}
}
func TestStoredTunnelRejectsLegacyOrPartialState(t *testing.T) {
for _, values := range []map[string]string{
{"token": "legacy-run-token"},
{"credentials.json": "{}"},
} {
if _, _, err := ParseStoredTunnel(values); err == nil {
t.Fatal("ambiguous tunnel state was accepted")
}
}
}
func TestReadCredentialsFileRequiresKnownFields(t *testing.T) {
path := filepath.Join(t.TempDir(), "credentials.json")
if err := os.WriteFile(path, []byte(`{"AccountTag":"account","TunnelSecret":"secret","TunnelID":"tunnel"}`), 0600); err != nil {
t.Fatal(err)
}
credentials, err := ReadCredentialsFile(path)
if err != nil || credentials.TunnelID != "tunnel" {
t.Fatal("valid credential file was not accepted")
}
if err := os.WriteFile(path, []byte(`{"AccountTag":"account","TunnelSecret":"secret","TunnelID":"tunnel","extra":"value"}`), 0600); err != nil {
t.Fatal(err)
}
if _, err := ReadCredentialsFile(path); err == nil {
t.Fatal("credential file with unknown fields was accepted")
}
}
func TestRouteConfigAddAndRemoveAreIdempotent(t *testing.T) {
config := NewConfig("tunnel")
route, err := NewRoute("app.example.test", "http://service.default.svc:8080")
if err != nil {
t.Fatal(err)
}
changed, err := config.AddRoute(route)
if err != nil || !changed || len(config.Ingress) != 2 {
t.Fatal("route was not added before the terminal ingress")
}
changed, err = config.AddRoute(route)
if err != nil || changed {
t.Fatal("matching route add was not idempotent")
}
changed, err = config.RemoveRoute(route)
if err != nil || !changed || len(config.Ingress) != 1 || config.Ingress[0].Service != "http_status:404" {
t.Fatal("route removal did not preserve the terminal ingress")
}
changed, err = config.RemoveRoute(route)
if err != nil || changed {
t.Fatal("matching route remove was not idempotent")
}
}