Files
capsule/pkg/utils/namespace_selector_test.go
Oliver Bähler a6b830b1af feat: add ruleset api(#1844)
* fix(controller): decode old object for delete requests

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: modernize golang

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: modernize golang

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: modernize golang

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* fix(config): remove usergroups default

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* fix(config): remove usergroups default

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* sec(ghsa-2ww6-hf35-mfjm): intercept namespace subresource

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* chore: conflicts

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

* feat(api): add rulestatus api

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>

---------

Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>
2026-01-27 14:28:48 +01:00

176 lines
3.9 KiB
Go

// Copyright 2020-2026 Project Capsule Authors
// SPDX-License-Identifier: Apache-2.0
package utils_test
import (
"testing"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/projectcapsule/capsule/pkg/utils"
)
func TestIsNamespaceSelectedBySelector_NilSelectorMatchesAll(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"env": "prod"},
},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, nil)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if !ok {
t.Fatalf("expected match=true for nil selector, got false")
}
}
func TestIsNamespaceSelectedBySelector_MatchLabels(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"env": "prod", "team": "a"},
},
}
selector := &metav1.LabelSelector{
MatchLabels: map[string]string{"env": "prod"},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if !ok {
t.Fatalf("expected match=true, got false")
}
}
func TestIsNamespaceSelectedBySelector_NoMatchLabels(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"env": "dev"},
},
}
selector := &metav1.LabelSelector{
MatchLabels: map[string]string{"env": "prod"},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if ok {
t.Fatalf("expected match=false, got true")
}
}
func TestIsNamespaceSelectedBySelector_MatchExpressions_In(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"tier": "backend"},
},
}
selector := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "tier",
Operator: metav1.LabelSelectorOpIn,
Values: []string{"backend", "worker"},
},
},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if !ok {
t.Fatalf("expected match=true, got false")
}
}
func TestIsNamespaceSelectedBySelector_MatchExpressions_NotIn(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"tier": "frontend"},
},
}
selector := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "tier",
Operator: metav1.LabelSelectorOpNotIn,
Values: []string{"backend", "worker"},
},
},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if !ok {
t.Fatalf("expected match=true (frontend not in backend/worker), got false")
}
}
func TestIsNamespaceSelectedBySelector_EmptyLabels_NoMatch(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: nil,
},
}
selector := &metav1.LabelSelector{
MatchLabels: map[string]string{"env": "prod"},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if ok {
t.Fatalf("expected match=false with missing label, got true")
}
}
func TestIsNamespaceSelectedBySelector_InvalidSelectorReturnsError(t *testing.T) {
ns := &corev1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: "ns1",
Labels: map[string]string{"env": "prod"},
},
}
// Invalid: In operator requires non-empty Values
selector := &metav1.LabelSelector{
MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: "env",
Operator: metav1.LabelSelectorOpIn,
Values: nil,
},
},
}
ok, err := utils.IsNamespaceSelectedBySelector(ns, selector)
if err == nil {
t.Fatalf("expected error, got nil")
}
if ok {
t.Fatalf("expected match=false on error, got true")
}
}