1
0
mirror of https://github.com/rancher/norman.git synced 2025-08-12 12:41:57 +00:00
norman/store/proxy/proxy_store_test.go

201 lines
4.5 KiB
Go

package proxy
import (
"bytes"
"encoding/json"
"github.com/rancher/norman/authorization"
"github.com/rancher/norman/types"
"github.com/stretchr/testify/assert"
"io"
v1 "k8s.io/api/core/v1"
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/rest"
"k8s.io/client-go/rest/fake"
"net/http"
"sync"
"testing"
)
func TestGetDeletionOptions(t *testing.T) {
req, err := http.NewRequest("DELETE", "https://test.url/api", nil)
assert.Empty(t, err)
prop := metav1.DeletePropagationBackground
expected := &metav1.DeleteOptions{
PropagationPolicy: &prop,
}
options, err := getDeleteOption(req)
assert.Empty(t, err)
assert.Equal(t, options, expected, "unexpected deletion options for empty query")
req.URL.RawQuery = "gracePeriodSeconds=0"
period := int64(0)
expected = &metav1.DeleteOptions{
PropagationPolicy: &prop,
GracePeriodSeconds: &period,
}
options, err = getDeleteOption(req)
assert.Empty(t, err)
assert.Equal(t, options, expected, "unexpected deletion options for query 'gracePeriodSeconds=0'")
}
func TestList(t *testing.T) {
var data = v1.ConfigMapList{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMapList",
APIVersion: "v1",
},
ListMeta: metav1.ListMeta{
ResourceVersion: "v1",
RemainingItemCount: new(int64),
},
Items: []v1.ConfigMap{
{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test1",
Namespace: "default",
},
Immutable: new(bool),
Data: map[string]string{
"a": "av",
"b": "bv",
"c": "cv",
},
},
{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test2",
Namespace: "default",
},
Immutable: new(bool),
Data: map[string]string{
"a2": "av",
"b2": "bv",
"c2": "cv",
},
},
{
TypeMeta: metav1.TypeMeta{
Kind: "ConfigMap",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test3",
Namespace: "default",
},
Immutable: new(bool),
Data: map[string]string{
"a3": "av",
"b3": "bv",
"c3": "cv",
},
},
},
}
clientGetter := mockClientGetter{
&fake.RESTClient{
NegotiatedSerializer: serializer.NewCodecFactory(runtime.NewScheme()),
},
}
typer := runtime.NewScheme()
var sut = &Store{
Mutex: sync.Mutex{},
clientGetter: &clientGetter,
group: "",
version: "v1",
kind: "ConfigMap",
resourcePlural: "configmaps",
typer: typer,
}
schema := types.Schema{
Mapper: types.Mappers{},
}
req, _ := http.NewRequest(http.MethodGet, "", nil)
apiContext := types.APIContext{
Request: req,
AccessControl: &authorization.AllAccess{},
}
// no results
{
body := data
body.Items = nil
var fakeResponse bytes.Buffer
_ = json.NewEncoder(&fakeResponse).Encode(body)
clientGetter.RESTClient.Resp = &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(&fakeResponse),
}
res, err := sut.List(&apiContext, &schema, &types.QueryOptions{})
assert.NoError(t, err)
assert.IsType(t, []map[string]interface{}{}, res)
assert.Len(t, res, 0)
}
// generic type
{
body := data
var fakeResponse bytes.Buffer
_ = json.NewEncoder(&fakeResponse).Encode(body)
clientGetter.RESTClient.Resp = &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(&fakeResponse),
}
res, err := sut.List(&apiContext, &schema, &types.QueryOptions{})
assert.NoError(t, err)
assert.IsType(t, []map[string]interface{}{}, res)
assert.Len(t, res, 3)
}
_ = v1.SchemeBuilder.AddToScheme(typer)
// specific type
{
body := data
var fakeResponse bytes.Buffer
_ = json.NewEncoder(&fakeResponse).Encode(body)
clientGetter.RESTClient.Resp = &http.Response{
StatusCode: http.StatusOK,
Body: io.NopCloser(&fakeResponse),
}
res, err := sut.List(&apiContext, &schema, &types.QueryOptions{})
assert.NoError(t, err)
assert.IsType(t, []map[string]interface{}{}, res)
assert.Len(t, res, 3)
}
}
type mockClientGetter struct {
*fake.RESTClient
}
func (m mockClientGetter) UnversionedClient(_ *types.APIContext, _ types.StorageContext) (rest.Interface, error) {
return m.RESTClient, nil
}
func (m mockClientGetter) APIExtClient(_ *types.APIContext, _ types.StorageContext) (clientset.Interface, error) {
return nil, nil
}