make partial resource detection work for singular matches
This commit is contained in:
		@@ -206,23 +206,32 @@ func (m *DefaultRESTMapper) ResourcesFor(resource unversioned.GroupVersionResour
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	case hasGroup:
 | 
						case hasGroup:
 | 
				
			||||||
		requestedGroupResource := resource.GroupResource()
 | 
							requestedGroupResource := resource.GroupResource()
 | 
				
			||||||
		for currResource := range m.pluralToSingular {
 | 
							for plural, singular := range m.pluralToSingular {
 | 
				
			||||||
			if currResource.GroupResource() == requestedGroupResource {
 | 
								if singular.GroupResource() == requestedGroupResource {
 | 
				
			||||||
				ret = append(ret, currResource)
 | 
									ret = append(ret, plural)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if plural.GroupResource() == requestedGroupResource {
 | 
				
			||||||
 | 
									ret = append(ret, plural)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case hasVersion:
 | 
						case hasVersion:
 | 
				
			||||||
		for currResource := range m.pluralToSingular {
 | 
							for plural, singular := range m.pluralToSingular {
 | 
				
			||||||
			if currResource.Version == resource.Version && currResource.Resource == resource.Resource {
 | 
								if singular.Version == resource.Version && singular.Resource == resource.Resource {
 | 
				
			||||||
				ret = append(ret, currResource)
 | 
									ret = append(ret, plural)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if plural.Version == resource.Version && plural.Resource == resource.Resource {
 | 
				
			||||||
 | 
									ret = append(ret, plural)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		for currResource := range m.pluralToSingular {
 | 
							for plural, singular := range m.pluralToSingular {
 | 
				
			||||||
			if currResource.Resource == resource.Resource {
 | 
								if singular.Resource == resource.Resource {
 | 
				
			||||||
				ret = append(ret, currResource)
 | 
									ret = append(ret, plural)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if plural.Resource == resource.Resource {
 | 
				
			||||||
 | 
									ret = append(ret, plural)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -234,10 +234,11 @@ func TestRESTMapperKindsFor(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestRESTMapperResourcesFor(t *testing.T) {
 | 
					func TestRESTMapperResourcesFor(t *testing.T) {
 | 
				
			||||||
	testCases := []struct {
 | 
						testCases := []struct {
 | 
				
			||||||
		Name                     string
 | 
							Name                             string
 | 
				
			||||||
		PreferredOrder           []unversioned.GroupVersion
 | 
							PreferredOrder                   []unversioned.GroupVersion
 | 
				
			||||||
		KindsToRegister          []unversioned.GroupVersionKind
 | 
							KindsToRegister                  []unversioned.GroupVersionKind
 | 
				
			||||||
		PartialResourceToRequest unversioned.GroupVersionResource
 | 
							PluralPartialResourceToRequest   unversioned.GroupVersionResource
 | 
				
			||||||
 | 
							SingularPartialResourceToRequest unversioned.GroupVersionResource
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ExpectedResources   []unversioned.GroupVersionResource
 | 
							ExpectedResources   []unversioned.GroupVersionResource
 | 
				
			||||||
		ExpectedResourceErr string
 | 
							ExpectedResourceErr string
 | 
				
			||||||
@@ -254,7 +255,8 @@ func TestRESTMapperResourcesFor(t *testing.T) {
 | 
				
			|||||||
				{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
				
			||||||
				{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			PartialResourceToRequest: unversioned.GroupVersionResource{Resource: "my-kinds"},
 | 
								PluralPartialResourceToRequest:   unversioned.GroupVersionResource{Resource: "my-kinds"},
 | 
				
			||||||
 | 
								SingularPartialResourceToRequest: unversioned.GroupVersionResource{Resource: "my-kind"},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ExpectedResources: []unversioned.GroupVersionResource{
 | 
								ExpectedResources: []unversioned.GroupVersionResource{
 | 
				
			||||||
				{Group: "second-group", Version: "first-version", Resource: "my-kinds"},
 | 
									{Group: "second-group", Version: "first-version", Resource: "my-kinds"},
 | 
				
			||||||
@@ -275,7 +277,8 @@ func TestRESTMapperResourcesFor(t *testing.T) {
 | 
				
			|||||||
				{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
				
			||||||
				{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			PartialResourceToRequest: unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kinds"},
 | 
								PluralPartialResourceToRequest:   unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kinds"},
 | 
				
			||||||
 | 
								SingularPartialResourceToRequest: unversioned.GroupVersionResource{Group: "first-group", Resource: "my-kind"},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ExpectedResources: []unversioned.GroupVersionResource{
 | 
								ExpectedResources: []unversioned.GroupVersionResource{
 | 
				
			||||||
				{Group: "first-group", Version: "first-version", Resource: "my-kinds"},
 | 
									{Group: "first-group", Version: "first-version", Resource: "my-kinds"},
 | 
				
			||||||
@@ -294,7 +297,8 @@ func TestRESTMapperResourcesFor(t *testing.T) {
 | 
				
			|||||||
				{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "my-kind"},
 | 
				
			||||||
				{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
									{Group: "second-group", Version: "first-version", Kind: "your-kind"},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			PartialResourceToRequest: unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kinds"},
 | 
								PluralPartialResourceToRequest:   unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kinds"},
 | 
				
			||||||
 | 
								SingularPartialResourceToRequest: unversioned.GroupVersionResource{Version: "first-version", Resource: "my-kind"},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ExpectedResources: []unversioned.GroupVersionResource{
 | 
								ExpectedResources: []unversioned.GroupVersionResource{
 | 
				
			||||||
				{Group: "first-group", Version: "first-version", Resource: "my-kinds"},
 | 
									{Group: "first-group", Version: "first-version", Resource: "my-kinds"},
 | 
				
			||||||
@@ -305,41 +309,44 @@ func TestRESTMapperResourcesFor(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	for _, testCase := range testCases {
 | 
						for _, testCase := range testCases {
 | 
				
			||||||
		tcName := testCase.Name
 | 
							tcName := testCase.Name
 | 
				
			||||||
		mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces)
 | 
					 | 
				
			||||||
		for _, kind := range testCase.KindsToRegister {
 | 
					 | 
				
			||||||
			mapper.Add(kind, RESTScopeNamespace)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		actualResources, err := mapper.ResourcesFor(testCase.PartialResourceToRequest)
 | 
							for _, partialResource := range []unversioned.GroupVersionResource{testCase.PluralPartialResourceToRequest, testCase.SingularPartialResourceToRequest} {
 | 
				
			||||||
		if err != nil {
 | 
								mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces)
 | 
				
			||||||
			t.Errorf("%s: unexpected error: %v", tcName, err)
 | 
								for _, kind := range testCase.KindsToRegister {
 | 
				
			||||||
			continue
 | 
									mapper.Add(kind, RESTScopeNamespace)
 | 
				
			||||||
		}
 | 
								}
 | 
				
			||||||
		if !reflect.DeepEqual(testCase.ExpectedResources, actualResources) {
 | 
					 | 
				
			||||||
			t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources, actualResources)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		singleResource, err := mapper.ResourceFor(testCase.PartialResourceToRequest)
 | 
								actualResources, err := mapper.ResourcesFor(partialResource)
 | 
				
			||||||
		if err == nil && len(testCase.ExpectedResourceErr) != 0 {
 | 
								if err != nil {
 | 
				
			||||||
			t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedResourceErr)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			if len(testCase.ExpectedResourceErr) == 0 {
 | 
					 | 
				
			||||||
				t.Errorf("%s: unexpected error: %v", tcName, err)
 | 
									t.Errorf("%s: unexpected error: %v", tcName, err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			} else {
 | 
								}
 | 
				
			||||||
				if !strings.Contains(err.Error(), testCase.ExpectedResourceErr) {
 | 
								if !reflect.DeepEqual(testCase.ExpectedResources, actualResources) {
 | 
				
			||||||
					t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResourceErr, err)
 | 
									t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources, actualResources)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								singleResource, err := mapper.ResourceFor(partialResource)
 | 
				
			||||||
 | 
								if err == nil && len(testCase.ExpectedResourceErr) != 0 {
 | 
				
			||||||
 | 
									t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedResourceErr)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									if len(testCase.ExpectedResourceErr) == 0 {
 | 
				
			||||||
 | 
										t.Errorf("%s: unexpected error: %v", tcName, err)
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										if !strings.Contains(err.Error(), testCase.ExpectedResourceErr) {
 | 
				
			||||||
 | 
											t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResourceErr, err)
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		} else {
 | 
								} else {
 | 
				
			||||||
			if testCase.ExpectedResources[0] != singleResource {
 | 
									if testCase.ExpectedResources[0] != singleResource {
 | 
				
			||||||
				t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources[0], singleResource)
 | 
										t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources[0], singleResource)
 | 
				
			||||||
			}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user