From aab9cd5ff905fd3c1abdb1d768dc2ae981d456b1 Mon Sep 17 00:00:00 2001 From: Amir Malka Date: Tue, 25 Jul 2023 15:24:09 +0300 Subject: [PATCH] added unit tests Signed-off-by: Amir Malka --- core/pkg/resourcehandler/datastructures.go | 11 -- ...ucturesmethods.go => queryableresource.go} | 10 ++ .../resourcehandler/queryableresource_test.go | 126 ++++++++++++++++++ .../v1/datastructuremethods_test.go | 17 +++ 4 files changed, 153 insertions(+), 11 deletions(-) delete mode 100644 core/pkg/resourcehandler/datastructures.go rename core/pkg/resourcehandler/{datastructuresmethods.go => queryableresource.go} (72%) create mode 100644 core/pkg/resourcehandler/queryableresource_test.go diff --git a/core/pkg/resourcehandler/datastructures.go b/core/pkg/resourcehandler/datastructures.go deleted file mode 100644 index 577003ea..00000000 --- a/core/pkg/resourcehandler/datastructures.go +++ /dev/null @@ -1,11 +0,0 @@ -package resourcehandler - -type QueryableResources map[string]QueryableResource - -// QueryableResource is a struct that holds a representation of a resource we would like to query (from the K8S API, or from other sources) -type QueryableResource struct { - // - GroupVersionResourceTriplet string - // metadata.name==, metadata.namespace== etc. - FieldSelectors string -} diff --git a/core/pkg/resourcehandler/datastructuresmethods.go b/core/pkg/resourcehandler/queryableresource.go similarity index 72% rename from core/pkg/resourcehandler/datastructuresmethods.go rename to core/pkg/resourcehandler/queryableresource.go index 1394b610..e1ec5759 100644 --- a/core/pkg/resourcehandler/datastructuresmethods.go +++ b/core/pkg/resourcehandler/queryableresource.go @@ -6,6 +6,16 @@ import ( "github.com/kubescape/kubescape/v2/core/cautils" ) +type QueryableResources map[string]QueryableResource + +// QueryableResource is a struct that holds a representation of a resource we would like to query (from the K8S API, or from other sources) +type QueryableResource struct { + // + GroupVersionResourceTriplet string + // metadata.name==, metadata.namespace== etc. + FieldSelectors string +} + func (qr *QueryableResource) String() string { if qr.FieldSelectors == "" { return qr.GroupVersionResourceTriplet diff --git a/core/pkg/resourcehandler/queryableresource_test.go b/core/pkg/resourcehandler/queryableresource_test.go new file mode 100644 index 00000000..fcd04b3d --- /dev/null +++ b/core/pkg/resourcehandler/queryableresource_test.go @@ -0,0 +1,126 @@ +package resourcehandler + +import ( + "fmt" + "reflect" + "testing" + + "github.com/kubescape/kubescape/v2/core/cautils" +) + +func TestString(t *testing.T) { + tt := []struct { + name string + input QueryableResource + output string + }{ + { + name: "Empty field selectors", + input: QueryableResource{GroupVersionResourceTriplet: "/v1/pods", FieldSelectors: ""}, + output: "/v1/pods", + }, + { + name: "Non-empty field selectors", + input: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"}, + output: "/v1/pods/fs1", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + result := tc.input.String() + if result != tc.output { + t.Errorf("Expected: %s, got: %s", tc.output, result) + } + }) + } +} + +func TestCopy(t *testing.T) { + rsrc := &QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"} + copy := rsrc.Copy() + + if copy != *rsrc { + t.Errorf("Expected: %v, got: %v", *rsrc, copy) + } + + if fmt.Sprintf("%p", rsrc) == fmt.Sprintf("%p", ©) { + t.Errorf("pointers of original object and copy should not be same. object: %p, copy: %p", rsrc, ©) + } +} + +func TestAddFieldSelector(t *testing.T) { + tt := []struct { + name string + initial QueryableResource + fieldSelector string + expected QueryableResource + }{ + { + name: "Add to empty FieldSelectors", + initial: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: ""}, + fieldSelector: "fs1", + expected: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"}, + }, + { + name: "Add to non-empty FieldSelectors", + initial: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"}, + fieldSelector: "fs2", + expected: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1,fs2"}, + }, + { + name: "Add empty FieldSelector to non-empty FieldSelectors", + initial: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"}, + fieldSelector: "", + expected: QueryableResource{GroupVersionResourceTriplet: "gvr1", FieldSelectors: "fs1"}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tc.initial.AddFieldSelector(tc.fieldSelector) + + if tc.initial != tc.expected { + t.Errorf("Expected: %v, got: %v", tc.expected, tc.initial) + } + }) + } +} + +func TestToK8sResourceMap(t *testing.T) { + qrm := make(QueryableResources) + qrm.Add(QueryableResource{GroupVersionResourceTriplet: "/v1/pods", FieldSelectors: "metadata.namespace=kube-system"}) + qrm.Add(QueryableResource{GroupVersionResourceTriplet: "/v1/pods", FieldSelectors: "metadata.namespace=default"}) + qrm.Add(QueryableResource{GroupVersionResourceTriplet: "/v1/nodes", FieldSelectors: ""}) + qrm.Add(QueryableResource{GroupVersionResourceTriplet: "batch/v1/jobs", FieldSelectors: ""}) + + expectedResult := cautils.K8SResources{ + "/v1/pods": nil, + "/v1/nodes": nil, + "batch/v1/jobs": nil, + } + + result := qrm.ToK8sResourceMap() + + if len(result) != len(expectedResult) { + t.Fatalf("Expected: %v, got: %v", expectedResult, result) + } + + for k, v := range result { + if _, ok := expectedResult[k]; !ok || v != nil { + t.Fatalf("Expected: %v, got: %v", expectedResult, result) + } + } +} + +func TestAdd(t *testing.T) { + qrMap := make(QueryableResources) + qr := QueryableResource{GroupVersionResourceTriplet: "/v1/pods", FieldSelectors: "metadata.namespace=default"} + qrMap.Add(qr) + + if resource, ok := qrMap["/v1/pods/metadata.namespace=default"]; !ok { + t.Fatalf("Expected resource was not added to the map") + } else if !reflect.DeepEqual(resource, qr) { + t.Fatalf("Expected: %v, got: %v", qr, resource) + } +} diff --git a/httphandler/handlerequests/v1/datastructuremethods_test.go b/httphandler/handlerequests/v1/datastructuremethods_test.go index 5fe3d371..0fe8c4f7 100644 --- a/httphandler/handlerequests/v1/datastructuremethods_test.go +++ b/httphandler/handlerequests/v1/datastructuremethods_test.go @@ -57,6 +57,23 @@ func TestToScanInfo(t *testing.T) { s := ToScanInfo(req) assert.True(t, s.ScanAll) assert.True(t, s.FrameworkScan) + assert.Nil(t, s.WorkloadIdentifier) + } + { + req := &utilsmetav1.PostScanRequest{ + Workload: &apisv1.WorkloadScan{ + ApiVersion: "apps/v1", + Kind: "Deployment", + Name: "nginx", + Namespace: "ns1", + }, + } + s := ToScanInfo(req) + assert.NotNil(t, s.WorkloadIdentifier) + assert.Equal(t, "apps/v1", s.WorkloadIdentifier.ApiVersion) + assert.Equal(t, "Deployment", s.WorkloadIdentifier.Kind) + assert.Equal(t, "nginx", s.WorkloadIdentifier.Name) + assert.Equal(t, "ns1", s.WorkloadIdentifier.Namespace) } }