Files
capsule/pkg/ruleengine/validate_ingress_test.go
T
Oliver BählerandGitHub f1b760a87a feat(rules): improve metadata enforcement and add ingress rules (#2050)
* feat: implement namespace metadata enforcement

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

* feat: add ingress enforcment

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>

---------

Signed-off-by: Oliver Baehler <oliver@sudo-i.net>
2026-07-22 22:24:54 +02:00

67 lines
2.3 KiB
Go

// Copyright 2020-2026 Project Capsule Authors
// SPDX-License-Identifier: Apache-2.0
package ruleengine
import (
"strings"
"testing"
"github.com/projectcapsule/capsule/pkg/api/rules"
"github.com/projectcapsule/capsule/pkg/api/runtime"
)
func TestValidateIngressRules(t *testing.T) {
t.Parallel()
valid := []*rules.NamespaceRuleBodyNamespace{{
Enforce: &rules.NamespaceRuleEnforceBody{
Ingress: rules.NamespaceRuleEnforceIngressBody{
Types: []rules.IngressType{
rules.IngressTypeIngress,
rules.IngressTypeListenerSet,
rules.IngressTypeHTTPRoute,
rules.IngressTypeGateway,
rules.IngressTypeTLSRoute,
rules.IngressTypeGRPCRoute,
},
Hostnames: []runtime.ExpressionMatch{{
Exact: []string{"prod", "test"},
ExpressionRegex: runtime.ExpressionRegex{
Expression: ".*\\.example\\.com",
},
}},
},
},
}}
if err := ValidateRuleStatusBody(nil, valid); err != nil {
t.Fatalf("ValidateRuleStatusBody(valid) error = %v", err)
}
invalidType := valid[0].DeepCopy()
invalidType.Enforce.Ingress.Types = []rules.IngressType{"TCPRoute"}
if err := ValidateRuleStatusBody(nil, []*rules.NamespaceRuleBodyNamespace{invalidType}); err == nil || !strings.Contains(err.Error(), "unsupported ingress resource type") {
t.Fatalf("ValidateRuleStatusBody(invalid type) error = %v", err)
}
invalidRegex := valid[0].DeepCopy()
invalidRegex.Enforce.Ingress.Hostnames = []runtime.ExpressionMatch{{
ExpressionRegex: runtime.ExpressionRegex{Expression: "("},
}}
if err := ValidateRuleStatusBody(nil, []*rules.NamespaceRuleBodyNamespace{invalidRegex}); err == nil || !strings.Contains(err.Error(), "ingress.hostnames[0].exp") {
t.Fatalf("ValidateRuleStatusBody(invalid regex) error = %v", err)
}
missingTypes := valid[0].DeepCopy()
missingTypes.Enforce.Ingress.Types = nil
if err := ValidateRuleStatusBody(nil, []*rules.NamespaceRuleBodyNamespace{missingTypes}); err == nil || !strings.Contains(err.Error(), "ingress.types") {
t.Fatalf("ValidateRuleStatusBody(missing types) error = %v", err)
}
missingHostnames := valid[0].DeepCopy()
missingHostnames.Enforce.Ingress.Hostnames = nil
if err := ValidateRuleStatusBody(nil, []*rules.NamespaceRuleBodyNamespace{missingHostnames}); err == nil || !strings.Contains(err.Error(), "ingress.hostnames") {
t.Fatalf("ValidateRuleStatusBody(missing hostnames) error = %v", err)
}
}