Files

221 lines
5.3 KiB
Go

package apistore
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"k8s.io/apiserver/pkg/storage"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/storage/unified/resourcepb"
)
func TestToListRequest(t *testing.T) {
tests := []struct {
name string
key *resourcepb.ResourceKey
opts storage.ListOptions
want *resourcepb.ListRequest
wantPredicate storage.SelectionPredicate
wantErr error
}{
{
name: "basic list request",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
Options: &resourcepb.ListOptions{
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
},
},
wantPredicate: storage.SelectionPredicate{},
wantErr: nil,
},
{
name: "with resource version",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
ResourceVersion: "123",
},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
ResourceVersion: 123,
Options: &resourcepb.ListOptions{
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
},
},
wantPredicate: storage.SelectionPredicate{},
wantErr: nil,
},
{
name: "invalid resource version",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
ResourceVersion: "invalid",
},
want: nil,
wantPredicate: storage.SelectionPredicate{},
wantErr: apierrors.NewBadRequest("invalid resource version: invalid"),
},
{
name: "with label selector",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
Predicate: storage.SelectionPredicate{
Label: labels.SelectorFromSet(labels.Set{"key": "value"}),
},
},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
Options: &resourcepb.ListOptions{
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
Labels: []*resourcepb.Requirement{
{
Key: "key",
Operator: string(selection.Equals),
Values: []string{"value"},
},
},
},
},
wantPredicate: storage.SelectionPredicate{
Label: labels.SelectorFromSet(labels.Set{"key": "value"}),
},
wantErr: nil,
},
{
name: "with trash label",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
Predicate: storage.SelectionPredicate{
Label: labels.SelectorFromSet(labels.Set{utils.LabelKeyGetTrash: "true"}),
},
},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
Source: resourcepb.ListRequest_TRASH,
Options: &resourcepb.ListOptions{
Labels: nil,
Fields: nil,
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
},
},
wantPredicate: storage.Everything,
wantErr: nil,
},
{
name: "with history label",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
Predicate: storage.SelectionPredicate{
Label: labels.SelectorFromSet(labels.Set{utils.LabelKeyGetHistory: "true"}),
Field: fields.SelectorFromSet(fields.Set{"metadata.name": "test-name"}),
},
},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
Source: resourcepb.ListRequest_HISTORY,
Options: &resourcepb.ListOptions{
Labels: nil,
Fields: nil,
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
Name: "test-name",
},
},
},
wantPredicate: storage.Everything,
wantErr: nil,
},
{
name: "with fullpath label",
key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
opts: storage.ListOptions{
Predicate: storage.SelectionPredicate{
Label: labels.SelectorFromSet(labels.Set{utils.LabelGetFullpath: "true"}),
},
},
want: &resourcepb.ListRequest{
VersionMatchV2: 1,
Options: &resourcepb.ListOptions{
Labels: nil,
Fields: nil,
Key: &resourcepb.ResourceKey{
Group: "test",
Resource: "test",
Namespace: "default",
},
},
},
wantPredicate: storage.Everything,
wantErr: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, gotPredicate, err := toListRequest(tt.key, tt.opts)
if tt.wantErr != nil {
assert.Error(t, err)
assert.Equal(t, tt.wantErr.Error(), err.Error())
return
}
require.NoError(t, err)
assert.Equal(t, tt.want, got)
assert.Equal(t, tt.wantPredicate, gotPredicate)
})
}
}