github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/controller/registry/resolver/cache/operators_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  
     8  	opregistry "github.com/operator-framework/operator-registry/pkg/registry"
     9  )
    10  
    11  func TestGVKStringToProvidedAPISet(t *testing.T) {
    12  	tests := []struct {
    13  		name string
    14  		in   string
    15  		want APISet
    16  	}{
    17  		{
    18  			name: "EmptyString/EmptySet",
    19  			in:   "",
    20  			want: make(APISet),
    21  		},
    22  		{
    23  			name: "Garbage/EmptySet",
    24  			in:   ",,,,,alkjahsdfjlh!@#$%",
    25  			want: make(APISet),
    26  		},
    27  		{
    28  			name: "SingleBadGVK/EmptySet",
    29  			in:   "this-is.not-good",
    30  			want: make(APISet),
    31  		},
    32  		{
    33  			name: "MultipleBadGVK/EmptySet",
    34  			in:   "this-is.not-good,thisisnoteither",
    35  			want: make(APISet),
    36  		},
    37  		{
    38  			name: "SingleGoodGVK/SingleAPI",
    39  			in:   "Goose.v1alpha1.birds.com",
    40  			want: APISet{
    41  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
    42  			},
    43  		},
    44  		{
    45  			name: "MutlipleGoodGVK/MultipleAPIs",
    46  			in:   "Goose.v1alpha1.birds.com,Moose.v1alpha1.mammals.com",
    47  			want: APISet{
    48  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}:   {},
    49  				opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Moose"}: {},
    50  			},
    51  		},
    52  		{
    53  			name: "SingleGoodGVK/SingleBadGVK/SingleAPI",
    54  			in:   "Goose.v1alpha1.birds.com,Moose.v1alpha1",
    55  			want: APISet{
    56  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
    57  			},
    58  		},
    59  		{
    60  			name: "MultipleGoodGVK/MultipleBadGVK/MultipleAPIs",
    61  			in:   "Goose.v1alpha1.birds.com,Moose.v1alpha1,Goat,Egret.v1beta1.birds.com",
    62  			want: APISet{
    63  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
    64  				opregistry.APIKey{Group: "birds.com", Version: "v1beta1", Kind: "Egret"}:  {},
    65  			},
    66  		},
    67  	}
    68  
    69  	for _, tt := range tests {
    70  		t.Run(tt.name, func(t *testing.T) {
    71  			require.EqualValues(t, tt.want, GVKStringToProvidedAPISet(tt.in))
    72  		})
    73  	}
    74  }
    75  func TestAPIKeyToGVKString(t *testing.T) {
    76  	tests := []struct {
    77  		name string
    78  		in   opregistry.APIKey
    79  		want string
    80  	}{
    81  		{
    82  			name: "EmptyAPIKey",
    83  			in:   opregistry.APIKey{},
    84  			want: "..",
    85  		},
    86  		{
    87  			name: "BadAPIKey",
    88  			in:   opregistry.APIKey{Group: "birds. ", Version: "-"},
    89  			want: ".-.birds. ",
    90  		},
    91  		{
    92  			name: "GoodAPIKey",
    93  			in:   opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"},
    94  			want: "Goose.v1alpha1.birds.com",
    95  		},
    96  	}
    97  
    98  	for _, tt := range tests {
    99  		t.Run(tt.name, func(t *testing.T) {
   100  			require.Equal(t, tt.want, APIKeyToGVKString(tt.in))
   101  		})
   102  	}
   103  }
   104  
   105  func TestAPISetString(t *testing.T) {
   106  	tests := []struct {
   107  		name string
   108  		in   APISet
   109  		want string
   110  	}{
   111  		{
   112  			name: "EmptySet",
   113  			in:   make(APISet),
   114  			want: "",
   115  		},
   116  		{
   117  			name: "OneAPI",
   118  			in: APISet{
   119  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
   120  			},
   121  			want: "Goose.v1alpha1.birds.com",
   122  		},
   123  		{
   124  			name: "MutipleAPIs",
   125  			in: APISet{
   126  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
   127  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Egret"}: {},
   128  			},
   129  			want: "Egret.v1alpha1.birds.com,Goose.v1alpha1.birds.com",
   130  		},
   131  		{
   132  			name: "MutipleAPIs/OneBad",
   133  			in: APISet{
   134  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1"}:                {},
   135  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {},
   136  				opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Egret"}: {},
   137  			},
   138  			want: ".v1alpha1.birds.com,Egret.v1alpha1.birds.com,Goose.v1alpha1.birds.com",
   139  		},
   140  	}
   141  
   142  	for _, tt := range tests {
   143  		t.Run(tt.name, func(t *testing.T) {
   144  			require.Equal(t, tt.want, tt.in.String())
   145  		})
   146  	}
   147  }
   148  
   149  func TestAPISetUnion(t *testing.T) {
   150  	type input struct {
   151  		left  APISet
   152  		right []APISet
   153  	}
   154  	tests := []struct {
   155  		name string
   156  		in   input
   157  		want APISet
   158  	}{
   159  		{
   160  			name: "EmptyLeft/NilRight/EmptySet",
   161  			in: input{
   162  				left:  make(APISet),
   163  				right: nil,
   164  			},
   165  			want: make(APISet),
   166  		},
   167  		{
   168  			name: "EmptyLeft/OneEmptyRight/EmptySet",
   169  			in: input{
   170  				left: make(APISet),
   171  				right: []APISet{
   172  					{},
   173  				},
   174  			},
   175  			want: make(APISet),
   176  		},
   177  		{
   178  			name: "EmptyLeft/OneRight/OneFromRight",
   179  			in: input{
   180  				left: make(APISet),
   181  				right: []APISet{
   182  					{
   183  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   184  					},
   185  				},
   186  			},
   187  			want: APISet{
   188  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   189  			},
   190  		},
   191  		{
   192  			name: "OneLeft/EmptyRight/OneFromLeft",
   193  			in: input{
   194  				left: APISet{
   195  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   196  				},
   197  				right: []APISet{
   198  					{},
   199  				},
   200  			},
   201  			want: APISet{
   202  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   203  			},
   204  		},
   205  		{
   206  			name: "MultipleLeft/MultipleRight/AllFromLeftAndRight",
   207  			in: input{
   208  				left: APISet{
   209  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   210  					opregistry.APIKey{Group: "Egret", Version: "v1beta1", Kind: "birds.com"}:  {},
   211  				},
   212  				right: []APISet{
   213  					{
   214  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   215  						opregistry.APIKey{Group: "Egret", Version: "v1beta1", Kind: "birds.com"}:  {},
   216  						opregistry.APIKey{Group: "Crow", Version: "v1beta1", Kind: "birds.com"}:   {},
   217  					},
   218  					{
   219  						// Empty APISet for good measure
   220  					},
   221  					{
   222  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   223  						opregistry.APIKey{Group: "Cow", Version: "v1alpha1", Kind: "mammals.com"}:   {},
   224  						opregistry.APIKey{Group: "Egret", Version: "v1beta1", Kind: "birds.com"}:    {},
   225  						opregistry.APIKey{Group: "Crow", Version: "v1beta1", Kind: "birds.com"}:     {},
   226  					},
   227  					{
   228  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   229  						opregistry.APIKey{Group: "Cow", Version: "v1alpha1", Kind: "mammals.com"}:   {},
   230  						opregistry.APIKey{Group: "Goat", Version: "v1beta1", Kind: "mammals.com"}:   {},
   231  					},
   232  				},
   233  			},
   234  			want: APISet{
   235  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   236  				opregistry.APIKey{Group: "Egret", Version: "v1beta1", Kind: "birds.com"}:    {},
   237  				opregistry.APIKey{Group: "Crow", Version: "v1beta1", Kind: "birds.com"}:     {},
   238  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   239  				opregistry.APIKey{Group: "Cow", Version: "v1alpha1", Kind: "mammals.com"}:   {},
   240  				opregistry.APIKey{Group: "Goat", Version: "v1beta1", Kind: "mammals.com"}:   {},
   241  			},
   242  		},
   243  	}
   244  
   245  	for _, tt := range tests {
   246  		t.Run(tt.name, func(t *testing.T) {
   247  			require.EqualValues(t, tt.want, tt.in.left.Union(tt.in.right...))
   248  		})
   249  	}
   250  }
   251  
   252  func TestAPISetIntersection(t *testing.T) {
   253  	type input struct {
   254  		left  APISet
   255  		right []APISet
   256  	}
   257  	tests := []struct {
   258  		name string
   259  		in   input
   260  		want APISet
   261  	}{
   262  		{
   263  			name: "EmptyLeft/NilRight/EmptySet",
   264  			in: input{
   265  				left:  make(APISet),
   266  				right: nil,
   267  			},
   268  			want: make(APISet),
   269  		},
   270  		{
   271  			name: "EmptyLeft/OneEmptyRight/EmptySet",
   272  			in: input{
   273  				left: make(APISet),
   274  				right: []APISet{
   275  					{},
   276  				},
   277  			},
   278  			want: make(APISet),
   279  		},
   280  		{
   281  			name: "EmptyLeft/OneRight/EmptySet",
   282  			in: input{
   283  				left: make(APISet),
   284  				right: []APISet{
   285  					{
   286  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   287  					},
   288  				},
   289  			},
   290  			want: make(APISet),
   291  		},
   292  		{
   293  			name: "OneLeft/EmptyRight/NoIntersection",
   294  			in: input{
   295  				left: APISet{
   296  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   297  				},
   298  				right: []APISet{
   299  					{},
   300  				},
   301  			},
   302  			want: make(APISet),
   303  		},
   304  		{
   305  			name: "OneLeft/TwoRight/OneIntersection",
   306  			in: input{
   307  				left: APISet{
   308  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   309  				},
   310  				right: []APISet{
   311  					{
   312  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   313  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   314  					},
   315  				},
   316  			},
   317  			want: APISet{
   318  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   319  			},
   320  		},
   321  		{
   322  			name: "OneLeft/TwoRight/SingleSet/OneIntersection",
   323  			in: input{
   324  				left: APISet{
   325  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   326  				},
   327  				right: []APISet{
   328  					{
   329  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   330  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   331  					},
   332  				},
   333  			},
   334  			want: APISet{
   335  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   336  			},
   337  		},
   338  		{
   339  			name: "TwoLeft/OneRight/SingleSet/OneIntersection",
   340  			in: input{
   341  				left: APISet{
   342  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   343  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   344  				},
   345  				right: []APISet{
   346  					{
   347  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   348  					},
   349  				},
   350  			},
   351  			want: APISet{
   352  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   353  			},
   354  		},
   355  		{
   356  			name: "OneLeft/TwoRight/SeparateSets/OneIntersection",
   357  			in: input{
   358  				left: APISet{
   359  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   360  				},
   361  				right: []APISet{
   362  					{
   363  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   364  					},
   365  					{
   366  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   367  					},
   368  				},
   369  			},
   370  			want: APISet{
   371  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   372  			},
   373  		},
   374  		{
   375  			name: "OneLeft/TwoRight/SeparateSets/NoIntersection",
   376  			in: input{
   377  				left: APISet{
   378  					opregistry.APIKey{Group: "Egret", Version: "v1alpha1", Kind: "birds.com"}: {},
   379  				},
   380  				right: []APISet{
   381  					{
   382  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   383  					},
   384  					{
   385  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   386  					},
   387  				},
   388  			},
   389  			want: make(APISet),
   390  		},
   391  		{
   392  			name: "MultipleLeft/MultipleRight/SeparateSets/SomeIntersection",
   393  			in: input{
   394  				left: APISet{
   395  					opregistry.APIKey{Group: "Egret", Version: "v1alpha1", Kind: "birds.com"}:   {},
   396  					opregistry.APIKey{Group: "Hippo", Version: "v1alpha1", Kind: "mammals.com"}: {},
   397  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   398  				},
   399  				right: []APISet{
   400  					{
   401  						opregistry.APIKey{Group: "Hippo", Version: "v1alpha1", Kind: "mammals.com"}: {},
   402  					},
   403  					{
   404  						opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   405  					},
   406  					{
   407  						opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}: {},
   408  					},
   409  					{
   410  						opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   411  					},
   412  				},
   413  			},
   414  			want: APISet{
   415  				opregistry.APIKey{Group: "Hippo", Version: "v1alpha1", Kind: "mammals.com"}: {},
   416  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   417  			},
   418  		},
   419  	}
   420  
   421  	for _, tt := range tests {
   422  		t.Run(tt.name, func(t *testing.T) {
   423  			require.EqualValues(t, tt.want, tt.in.left.Intersection(tt.in.right...))
   424  		})
   425  	}
   426  }
   427  
   428  func TestAPISetDifference(t *testing.T) {
   429  	type input struct {
   430  		left  APISet
   431  		right APISet
   432  	}
   433  	tests := []struct {
   434  		name string
   435  		in   input
   436  		want APISet
   437  	}{
   438  		{
   439  			name: "EmptySet",
   440  			in: input{
   441  				left:  make(APISet),
   442  				right: make(APISet),
   443  			},
   444  			want: make(APISet),
   445  		},
   446  		{
   447  			name: "OneLeft/EmptyRight/LeftIsDifference",
   448  			in: input{
   449  				left: APISet{
   450  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   451  				},
   452  				right: make(APISet),
   453  			},
   454  			want: APISet{
   455  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   456  			},
   457  		},
   458  		{
   459  			name: "EmptyLeft/OneRight/NoDifference",
   460  			in: input{
   461  				left: make(APISet),
   462  				right: APISet{
   463  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   464  				},
   465  			},
   466  			want: make(APISet),
   467  		},
   468  		{
   469  			name: "OneLeft/OneRight/NoDifference",
   470  			in: input{
   471  				left: APISet{
   472  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   473  				},
   474  				right: APISet{
   475  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   476  				},
   477  			},
   478  			want: make(APISet),
   479  		},
   480  		{
   481  			name: "MultipleLeft/MultipleRight/NoDifference",
   482  			in: input{
   483  				left: APISet{
   484  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   485  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   486  				},
   487  				right: APISet{
   488  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   489  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   490  				},
   491  			},
   492  			want: make(APISet),
   493  		},
   494  		{
   495  			name: "MultipleLeft/MultipleRight/SingleDifference",
   496  			in: input{
   497  				left: APISet{
   498  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   499  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   500  					opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}:  {},
   501  				},
   502  				right: APISet{
   503  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   504  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   505  				},
   506  			},
   507  			want: APISet{
   508  				opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}: {},
   509  			},
   510  		},
   511  		{
   512  			name: "MultipleLeft/MultipleRight/SomeDifference",
   513  			in: input{
   514  				left: APISet{
   515  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   516  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   517  					opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}:  {},
   518  				},
   519  				right: APISet{
   520  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}:  {},
   521  					opregistry.APIKey{Group: "Gopher", Version: "v1alpha2", Kind: "mammals.com"}: {},
   522  				},
   523  			},
   524  			want: APISet{
   525  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:  {},
   526  				opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}: {},
   527  			},
   528  		},
   529  		{
   530  			name: "MultipleLeft/MultipleRight/AllLeftDifference",
   531  			in: input{
   532  				left: APISet{
   533  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   534  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   535  					opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}:  {},
   536  				},
   537  				right: APISet{
   538  					opregistry.APIKey{Group: "Giraffe", Version: "v1alpha1", Kind: "mammals.com"}: {},
   539  					opregistry.APIKey{Group: "Gopher", Version: "v1alpha2", Kind: "mammals.com"}:  {},
   540  					opregistry.APIKey{Group: "Bison", Version: "v1beta1", Kind: "mammals.com"}:    {},
   541  				},
   542  			},
   543  			want: APISet{
   544  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   545  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   546  				opregistry.APIKey{Group: "Goat", Version: "v1alpha1", Kind: "mammals.com"}:  {},
   547  			},
   548  		},
   549  	}
   550  
   551  	for _, tt := range tests {
   552  		t.Run(tt.name, func(t *testing.T) {
   553  			require.EqualValues(t, tt.want, tt.in.left.Difference(tt.in.right))
   554  		})
   555  	}
   556  }
   557  
   558  func TestAPISetIsSubset(t *testing.T) {
   559  	type input struct {
   560  		left  APISet
   561  		right APISet
   562  	}
   563  	tests := []struct {
   564  		name string
   565  		in   input
   566  		want bool
   567  	}{
   568  		{
   569  			name: "EmptySet",
   570  			in: input{
   571  				left:  make(APISet),
   572  				right: make(APISet),
   573  			},
   574  			want: true,
   575  		},
   576  		{
   577  			name: "Same",
   578  			in: input{
   579  				left: APISet{
   580  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   581  				},
   582  				right: APISet{
   583  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   584  				},
   585  			},
   586  			want: true,
   587  		},
   588  		{
   589  			name: "IsSubset",
   590  			in: input{
   591  				left: APISet{
   592  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   593  				},
   594  				right: APISet{
   595  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   596  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   597  				},
   598  			},
   599  			want: true,
   600  		},
   601  		{
   602  			name: "NotSubset",
   603  			in: input{
   604  				left: APISet{
   605  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   606  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   607  				},
   608  				right: APISet{
   609  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   610  				},
   611  			},
   612  			want: false,
   613  		},
   614  		{
   615  			name: "NotSubset/EmptyRight",
   616  			in: input{
   617  				left: APISet{
   618  					opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   619  					opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   620  				},
   621  				right: make(APISet),
   622  			},
   623  			want: false,
   624  		},
   625  	}
   626  
   627  	for _, tt := range tests {
   628  		t.Run(tt.name, func(t *testing.T) {
   629  			require.Equal(t, tt.want, tt.in.left.IsSubset(tt.in.right))
   630  		})
   631  	}
   632  }
   633  
   634  func TestStripPlural(t *testing.T) {
   635  	tests := []struct {
   636  		name string
   637  		in   APISet
   638  		want APISet
   639  	}{
   640  		{
   641  			name: "EmptySet",
   642  			in:   make(APISet),
   643  			want: make(APISet),
   644  		},
   645  		{
   646  			name: "NilSet",
   647  			in:   nil,
   648  			want: make(APISet),
   649  		},
   650  		{
   651  			name: "OnePluralToRemove",
   652  			in: APISet{
   653  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com", Plural: "Geese"}: {},
   654  			},
   655  			want: APISet{
   656  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}: {},
   657  			},
   658  		},
   659  		{
   660  			name: "MultiplePluralsToRemove",
   661  			in: APISet{
   662  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com", Plural: "Geese"}:   {},
   663  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com", Plural: "Moose"}: {},
   664  			},
   665  			want: APISet{
   666  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   667  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   668  			},
   669  		},
   670  		{
   671  			name: "NoPluralsToRemove",
   672  			in: APISet{
   673  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   674  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   675  			},
   676  			want: APISet{
   677  				opregistry.APIKey{Group: "Goose", Version: "v1alpha1", Kind: "birds.com"}:   {},
   678  				opregistry.APIKey{Group: "Moose", Version: "v1alpha1", Kind: "mammals.com"}: {},
   679  			},
   680  		},
   681  	}
   682  
   683  	for _, tt := range tests {
   684  		t.Run(tt.name, func(t *testing.T) {
   685  			require.EqualValues(t, tt.want, tt.in.StripPlural())
   686  		})
   687  	}
   688  }
   689  
   690  func TestCatalogKey_String(t *testing.T) {
   691  	type fields struct {
   692  		Name      string
   693  		Namespace string
   694  	}
   695  	tests := []struct {
   696  		name   string
   697  		fields fields
   698  		want   string
   699  	}{
   700  		{
   701  			name:   "catalogkey",
   702  			fields: fields{Name: "test", Namespace: "namespace"},
   703  			want:   "test/namespace",
   704  		},
   705  	}
   706  	for _, tt := range tests {
   707  		t.Run(tt.name, func(t *testing.T) {
   708  			k := &SourceKey{
   709  				Name:      tt.fields.Name,
   710  				Namespace: tt.fields.Namespace,
   711  			}
   712  			if got := k.String(); got != tt.want {
   713  				t.Errorf("CatalogKey.String() = %v, want %v", got, tt.want)
   714  			}
   715  		})
   716  	}
   717  }
   718  
   719  func TestOperatorSourceInfo_String(t *testing.T) {
   720  	type fields struct {
   721  		Package                string
   722  		Channel                string
   723  		CatalogSource          string
   724  		CatalogSourceNamespace string
   725  	}
   726  	tests := []struct {
   727  		name   string
   728  		fields fields
   729  		want   string
   730  	}{
   731  		{
   732  			name: "testString",
   733  			fields: fields{
   734  				Package:                "p",
   735  				Channel:                "c",
   736  				CatalogSource:          "s",
   737  				CatalogSourceNamespace: "n",
   738  			},
   739  			want: "p/c in s/n",
   740  		},
   741  	}
   742  	for _, tt := range tests {
   743  		t.Run(tt.name, func(t *testing.T) {
   744  			i := &OperatorSourceInfo{
   745  				Package: tt.fields.Package,
   746  				Channel: tt.fields.Channel,
   747  				Catalog: SourceKey{Name: tt.fields.CatalogSource, Namespace: tt.fields.CatalogSourceNamespace},
   748  			}
   749  			if got := i.String(); got != tt.want {
   750  				t.Errorf("OperatorSourceInfo.String() = %v, want %v", got, tt.want)
   751  			}
   752  		})
   753  	}
   754  }