@@ -8,15 +8,17 @@ import (
88 "github.com/sirupsen/logrus/hooks/test"
99 "github.com/stretchr/testify/assert"
1010 "github.com/stretchr/testify/require"
11- "k8s.io/client-go/metadata/metadatalister"
12-
11+ rbacv1 "k8s.io/api/rbac/v1"
1312 "k8s.io/apimachinery/pkg/api/errors"
1413 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1514 "k8s.io/apimachinery/pkg/labels"
15+ "k8s.io/client-go/metadata/metadatalister"
1616 ktesting "k8s.io/client-go/testing"
1717
1818 "github.com/operator-framework/api/pkg/operators/v1alpha1"
1919 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake"
20+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache"
21+ "github.com/operator-framework/operator-registry/pkg/registry"
2022)
2123
2224func TestCopyToNamespace (t * testing.T ) {
@@ -407,3 +409,69 @@ func TestCSVCopyPrototype(t *testing.T) {
407409 },
408410 }, dst )
409411}
412+
413+ func TestOperator_getClusterRoleAggregationRule (t * testing.T ) {
414+ type args struct {
415+ apis cache.APISet
416+ suffix string
417+ }
418+ tests := []struct {
419+ name string
420+ apis cache.APISet
421+ suffix string
422+ want func (* testing.T , * rbacv1.AggregationRule )
423+ wantErr require.ErrorAssertionFunc
424+ }{
425+ {
426+ name : "no aggregation rule when no APIs" ,
427+ apis : cache.APISet {},
428+ suffix : "admin" ,
429+ want : func (t * testing.T , rule * rbacv1.AggregationRule ) {
430+ require .Nil (t , rule )
431+ },
432+ wantErr : require .NoError ,
433+ },
434+ {
435+ name : "ordered selectors in aggregation rule" ,
436+ apis : cache.APISet {
437+ registry.APIKey {Group : "example.com" , Version : "v1alpha1" , Kind : "Foo" }: {},
438+ registry.APIKey {Group : "example.com" , Version : "v1alpha2" , Kind : "Foo" }: {},
439+ registry.APIKey {Group : "example.com" , Version : "v1alpha3" , Kind : "Foo" }: {},
440+ registry.APIKey {Group : "example.com" , Version : "v1alpha4" , Kind : "Foo" }: {},
441+ registry.APIKey {Group : "example.com" , Version : "v1alpha5" , Kind : "Foo" }: {},
442+ registry.APIKey {Group : "example.com" , Version : "v1alpha1" , Kind : "Bar" }: {},
443+ registry.APIKey {Group : "example.com" , Version : "v1alpha2" , Kind : "Bar" }: {},
444+ registry.APIKey {Group : "example.com" , Version : "v1alpha3" , Kind : "Bar" }: {},
445+ registry.APIKey {Group : "example.com" , Version : "v1alpha4" , Kind : "Bar" }: {},
446+ registry.APIKey {Group : "example.com" , Version : "v1alpha5" , Kind : "Bar" }: {},
447+ },
448+ suffix : "admin" ,
449+ want : func (t * testing.T , rule * rbacv1.AggregationRule ) {
450+ getOneKey := func (t * testing.T , m map [string ]string ) string {
451+ require .Len (t , m , 1 )
452+ for k := range m {
453+ return k
454+ }
455+ t .Fatalf ("no keys found in map" )
456+ return ""
457+ }
458+
459+ a := getOneKey (t , rule .ClusterRoleSelectors [0 ].MatchLabels )
460+ for _ , selector := range rule .ClusterRoleSelectors [1 :] {
461+ b := getOneKey (t , selector .MatchLabels )
462+ require .Lessf (t , a , b , "expected selector match labels keys to be in sorted ascending order" )
463+ a = b
464+ }
465+ },
466+ wantErr : require .NoError ,
467+ },
468+ }
469+ for _ , tt := range tests {
470+ t .Run (tt .name , func (t * testing.T ) {
471+ a := & Operator {}
472+ got , err := a .getClusterRoleAggregationRule (tt .apis , tt .suffix )
473+ tt .wantErr (t , err )
474+ tt .want (t , got )
475+ })
476+ }
477+ }
0 commit comments