1
0
mirror of https://github.com/rancher/steve.git synced 2025-09-06 18:01:04 +00:00

Add unit tests for schemaless CRDs

This commit is contained in:
Eric Promislow
2024-07-29 16:31:39 -07:00
committed by Michael Bolot
parent 72384a606d
commit 8ce0b83be7
2 changed files with 225 additions and 0 deletions

View File

@@ -196,6 +196,59 @@ func TestRefresh(t *testing.T) {
}
}
func TestRefreshSchemalessCRDs(t *testing.T) {
schemalessModels, err := getSchemalessModels()
require.NoError(t, err)
crds, err := getSchemalessCRDs()
require.NoError(t, err)
for _, crd := range crds {
for _, crdVersion := range crd.Spec.Versions {
crdVersion.Schema = nil
}
}
test := struct {
name string
nilGroups bool
wantModels proto.Models
wantGVKModels map[string]gvkModel
}{
name: "problem - missing schema",
wantModels: schemalessModels,
wantGVKModels: map[string]gvkModel{
"management.cattle.io.schemaless": {
ModelName: "io.cattle.management.v2.schemaless",
},
},
}
t.Run(test.name, func(t *testing.T) {
client, err := buildDefaultServerlessDiscovery()
require.Nil(t, err)
baseSchemas := types.EmptyAPISchemas()
ctrl := gomock.NewController(t)
defer ctrl.Finish()
crdCache := fake.NewMockNonNamespacedCacheInterface[*apiextv1.CustomResourceDefinition](ctrl)
crdCache.EXPECT().List(labels.Everything()).Return(crds, nil).AnyTimes()
handler := NewSchemaDefinitionHandler(baseSchemas, crdCache, client)
err = handler.Refresh()
require.NoError(t, err)
handler.lock.RLock()
defer handler.lock.RUnlock()
require.Equal(t, test.wantModels, handler.models)
// Just test the model names, because the schema and crd will be null in the input
require.Equal(t, len(test.wantGVKModels), len(handler.gvkModels))
for k, v := range test.wantGVKModels {
require.Equal(t, v.ModelName, handler.gvkModels[k].ModelName)
}
})
}
func Test_byID(t *testing.T) {
discoveryClient, err := buildDefaultDiscovery()
require.NoError(t, err)
@@ -735,6 +788,65 @@ func buildDefaultDiscovery() (*fakeDiscovery, error) {
}, nil
}
func buildDefaultServerlessDiscovery() (*fakeDiscovery, error) {
document, err := openapi_v2.ParseDocument([]byte(rawSchemalessModels))
if err != nil {
return nil, fmt.Errorf("unable to parse rawSchemalessModels: %w", err)
}
groups := []metav1.APIGroup{
// The core groups (eg: Pods, ConfigMaps, etc)
{
Name: "",
PreferredVersion: metav1.GroupVersionForDiscovery{
GroupVersion: "v1",
Version: "v1",
},
Versions: []metav1.GroupVersionForDiscovery{
{
GroupVersion: "v1",
Version: "v1",
},
},
},
{
Name: "management.cattle.io",
PreferredVersion: metav1.GroupVersionForDiscovery{
GroupVersion: "management.cattle.io/v2",
Version: "v2",
},
Versions: []metav1.GroupVersionForDiscovery{
{
GroupVersion: "management.cattle.io/v1",
Version: "v1",
},
{
GroupVersion: "management.cattle.io/v2",
Version: "v2",
},
},
},
{
Name: "noversion.cattle.io",
Versions: []metav1.GroupVersionForDiscovery{
{
GroupVersion: "noversion.cattle.io/v1",
Version: "v1",
},
{
GroupVersion: "noversion.cattle.io/v2",
Version: "v2",
},
},
},
}
return &fakeDiscovery{
Groups: &metav1.APIGroupList{
Groups: groups,
},
Document: document,
}, nil
}
type fakeDiscovery struct {
Groups *metav1.APIGroupList
Document *openapi_v2.Document