diff --git a/testing/fixture.go b/testing/fixture.go index d3b93724..caa04511 100644 --- a/testing/fixture.go +++ b/testing/fixture.go @@ -20,6 +20,7 @@ import ( "fmt" "reflect" "sort" + "strings" "sync" jsonpatch "github.com/evanphx/json-patch" @@ -509,12 +510,8 @@ func (r *SimpleReactor) Handles(action Action) bool { if !verbCovers { return false } - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource - if !resourceCovers { - return false - } - return true + return resourceCovers(r.Resource, action) } func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) { @@ -530,12 +527,7 @@ type SimpleWatchReactor struct { } func (r *SimpleWatchReactor) Handles(action Action) bool { - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource - if !resourceCovers { - return false - } - - return true + return resourceCovers(r.Resource, action) } func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) { @@ -551,14 +543,27 @@ type SimpleProxyReactor struct { } func (r *SimpleProxyReactor) Handles(action Action) bool { - resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource - if !resourceCovers { - return false - } - - return true + return resourceCovers(r.Resource, action) } func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { return r.Reaction(action) } + +func resourceCovers(resource string, action Action) bool { + if resource == "*" { + return true + } + + if resource == action.GetResource().Resource { + return true + } + + if index := strings.Index(resource, "/"); index != -1 && + resource[:index] == action.GetResource().Resource && + resource[index+1:] == action.GetSubresource() { + return true + } + + return false +} diff --git a/testing/fixture_test.go b/testing/fixture_test.go index 6e026756..5aab05aa 100644 --- a/testing/fixture_test.go +++ b/testing/fixture_test.go @@ -322,3 +322,90 @@ func TestGetWithExactMatch(t *testing.T) { errNotFound = errors.NewNotFound(gvr.GroupResource(), "pod") assert.EqualError(t, err, errNotFound.Error()) } + +func Test_resourceCovers(t *testing.T) { + type args struct { + resource string + action Action + } + tests := []struct { + name string + args args + want bool + }{ + { + args: args{ + resource: "*", + action: ActionImpl{}, + }, + want: true, + }, + { + args: args{ + resource: "serviceaccounts", + action: ActionImpl{}, + }, + want: false, + }, + { + args: args{ + resource: "serviceaccounts", + action: ActionImpl{ + Resource: schema.GroupVersionResource{ + Resource: "serviceaccounts", + }, + }, + }, + want: true, + }, + { + args: args{ + resource: "serviceaccounts/token", + action: ActionImpl{ + Resource: schema.GroupVersionResource{}, + }, + }, + want: false, + }, + { + args: args{ + resource: "serviceaccounts/token", + action: ActionImpl{ + Resource: schema.GroupVersionResource{ + Resource: "serviceaccounts", + }, + }, + }, + want: false, + }, + { + args: args{ + resource: "serviceaccounts/token", + action: ActionImpl{ + Resource: schema.GroupVersionResource{}, + Subresource: "token", + }, + }, + want: false, + }, + { + args: args{ + resource: "serviceaccounts/token", + action: ActionImpl{ + Resource: schema.GroupVersionResource{ + Resource: "serviceaccounts", + }, + Subresource: "token", + }, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := resourceCovers(tt.args.resource, tt.args.action); got != tt.want { + t.Errorf("resourceCovers() = %v, want %v", got, tt.want) + } + }) + } +}