karmada/pkg/search/proxy/cluster_proxy_test.go

145 lines
3.0 KiB
Go

package proxy
import (
"bytes"
"encoding/json"
"io"
"io/ioutil"
"net/http"
"reflect"
"testing"
"github.com/google/go-cmp/cmp"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
"github.com/karmada-io/karmada/pkg/search/proxy/store"
)
func TestModifyRequest(t *testing.T) {
newObjectFunc := func(annotations map[string]string, resourceVersion string) *unstructured.Unstructured {
obj := &unstructured.Unstructured{}
obj.SetAPIVersion("v1")
obj.SetKind("Pod")
obj.SetAnnotations(annotations)
obj.SetResourceVersion(resourceVersion)
return obj
}
type args struct {
body interface{}
cluster string
}
type want struct {
body interface{}
}
tests := []struct {
name string
args args
want want
}{
{
name: "Empty body",
args: args{
body: nil,
},
want: want{
body: nil,
},
},
{
name: "Body with nil annotations",
args: args{
body: newObjectFunc(nil, ""),
},
want: want{
body: newObjectFunc(nil, ""),
},
},
{
name: "Body with empty annotations",
args: args{
body: newObjectFunc(map[string]string{}, ""),
},
want: want{
body: newObjectFunc(map[string]string{}, ""),
},
},
{
name: "Body with cache source annotation",
args: args{
body: newObjectFunc(map[string]string{clusterv1alpha1.CacheSourceAnnotationKey: "bar"}, ""),
},
want: want{
body: newObjectFunc(map[string]string{}, ""),
},
},
{
name: "Body with single cluster resource version",
args: args{
body: newObjectFunc(nil, "1234"),
cluster: "cluster1",
},
want: want{
body: newObjectFunc(nil, "1234"),
},
},
{
name: "Body with multi cluster resource version",
args: args{
body: newObjectFunc(nil, store.BuildMultiClusterResourceVersion(map[string]string{"cluster1": "1234", "cluster2": "5678"})),
cluster: "cluster1",
},
want: want{
body: newObjectFunc(nil, "1234"),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var body io.Reader
if tt.args.body != nil {
buf := bytes.NewBuffer(nil)
err := json.NewEncoder(buf).Encode(tt.args.body)
if err != nil {
t.Error(err)
return
}
body = buf
}
req, _ := http.NewRequest("PUT", "/api/v1/namespaces/default/pods/foo", body)
err := modifyRequest(req, tt.args.cluster)
if err != nil {
t.Error(err)
return
}
var get runtime.Object
if req.ContentLength != 0 {
data, err := ioutil.ReadAll(req.Body)
if err != nil {
t.Error(err)
return
}
if int64(len(data)) != req.ContentLength {
t.Errorf("expect contentLength %v, but got %v", len(data), req.ContentLength)
return
}
get, _, err = unstructured.UnstructuredJSONScheme.Decode(data, nil, nil)
if err != nil {
t.Error(err)
return
}
}
if !reflect.DeepEqual(tt.want.body, get) {
t.Errorf("get body diff: %v", cmp.Diff(tt.want.body, get))
}
})
}
}