Merge pull request #62801 from apelisse/patch-handlers
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. apiserver: move patch tests to their own file **What this PR does / why we need it**: Create a new file to test patch handler. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
This commit is contained in:
		@@ -12,6 +12,7 @@ go_test(
 | 
				
			|||||||
        "apiserver_test.go",
 | 
					        "apiserver_test.go",
 | 
				
			||||||
        "audit_test.go",
 | 
					        "audit_test.go",
 | 
				
			||||||
        "installer_test.go",
 | 
					        "installer_test.go",
 | 
				
			||||||
 | 
					        "patchhandler_test.go",
 | 
				
			||||||
        "watch_test.go",
 | 
					        "watch_test.go",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    embed = [":go_default_library"],
 | 
					    embed = [":go_default_library"],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2887,76 +2887,6 @@ func TestDeleteMissing(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestPatch(t *testing.T) {
 | 
					 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
	ID := "id"
 | 
					 | 
				
			||||||
	item := &genericapitesting.Simple{
 | 
					 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
					 | 
				
			||||||
			Name:      ID,
 | 
					 | 
				
			||||||
			Namespace: "", // update should allow the client to send an empty namespace
 | 
					 | 
				
			||||||
			UID:       "uid",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		Other: "bar",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{item: *item}
 | 
					 | 
				
			||||||
	storage["simple"] = &simpleStorage
 | 
					 | 
				
			||||||
	selfLinker := &setTestSelfLinker{
 | 
					 | 
				
			||||||
		t:           t,
 | 
					 | 
				
			||||||
		expectedSet: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/default/simple/" + ID,
 | 
					 | 
				
			||||||
		name:        ID,
 | 
					 | 
				
			||||||
		namespace:   metav1.NamespaceDefault,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handler := handleLinker(storage, selfLinker)
 | 
					 | 
				
			||||||
	server := httptest.NewServer(handler)
 | 
					 | 
				
			||||||
	defer server.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	client := http.Client{}
 | 
					 | 
				
			||||||
	request, err := http.NewRequest("PATCH", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, bytes.NewReader([]byte(`{"labels":{"foo":"bar"}}`)))
 | 
					 | 
				
			||||||
	request.Header.Set("Content-Type", "application/merge-patch+json; charset=UTF-8")
 | 
					 | 
				
			||||||
	response, err := client.Do(request)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	dump, _ := httputil.DumpResponse(response, true)
 | 
					 | 
				
			||||||
	t.Log(string(dump))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if simpleStorage.updated == nil || simpleStorage.updated.Labels["foo"] != "bar" {
 | 
					 | 
				
			||||||
		t.Errorf("Unexpected update value %#v, expected %#v.", simpleStorage.updated, item)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !selfLinker.called {
 | 
					 | 
				
			||||||
		t.Errorf("Never set self link")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestPatchRequiresMatchingName(t *testing.T) {
 | 
					 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
					 | 
				
			||||||
	ID := "id"
 | 
					 | 
				
			||||||
	item := &genericapitesting.Simple{
 | 
					 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
					 | 
				
			||||||
			Name:      ID,
 | 
					 | 
				
			||||||
			Namespace: "", // update should allow the client to send an empty namespace
 | 
					 | 
				
			||||||
			UID:       "uid",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		Other: "bar",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{item: *item}
 | 
					 | 
				
			||||||
	storage["simple"] = &simpleStorage
 | 
					 | 
				
			||||||
	handler := handle(storage)
 | 
					 | 
				
			||||||
	server := httptest.NewServer(handler)
 | 
					 | 
				
			||||||
	defer server.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	client := http.Client{}
 | 
					 | 
				
			||||||
	request, err := http.NewRequest("PATCH", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, bytes.NewReader([]byte(`{"metadata":{"name":"idbar"}}`)))
 | 
					 | 
				
			||||||
	request.Header.Set("Content-Type", "application/merge-patch+json")
 | 
					 | 
				
			||||||
	response, err := client.Do(request)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if response.StatusCode != http.StatusBadRequest {
 | 
					 | 
				
			||||||
		t.Errorf("Unexpected response %#v", response)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestUpdate(t *testing.T) {
 | 
					func TestUpdate(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{}
 | 
						simpleStorage := SimpleRESTStorage{}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2018 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package endpoints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/http/httptest"
 | 
				
			||||||
 | 
						"net/http/httputil"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
 | 
						genericapitesting "k8s.io/apiserver/pkg/endpoints/testing"
 | 
				
			||||||
 | 
						"k8s.io/apiserver/pkg/registry/rest"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPatch(t *testing.T) {
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						ID := "id"
 | 
				
			||||||
 | 
						item := &genericapitesting.Simple{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:      ID,
 | 
				
			||||||
 | 
								Namespace: "", // update should allow the client to send an empty namespace
 | 
				
			||||||
 | 
								UID:       "uid",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Other: "bar",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						simpleStorage := SimpleRESTStorage{item: *item}
 | 
				
			||||||
 | 
						storage["simple"] = &simpleStorage
 | 
				
			||||||
 | 
						selfLinker := &setTestSelfLinker{
 | 
				
			||||||
 | 
							t:           t,
 | 
				
			||||||
 | 
							expectedSet: "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/default/simple/" + ID,
 | 
				
			||||||
 | 
							name:        ID,
 | 
				
			||||||
 | 
							namespace:   metav1.NamespaceDefault,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handler := handleLinker(storage, selfLinker)
 | 
				
			||||||
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
						request, err := http.NewRequest("PATCH", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, bytes.NewReader([]byte(`{"labels":{"foo":"bar"}}`)))
 | 
				
			||||||
 | 
						request.Header.Set("Content-Type", "application/merge-patch+json; charset=UTF-8")
 | 
				
			||||||
 | 
						response, err := client.Do(request)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dump, _ := httputil.DumpResponse(response, true)
 | 
				
			||||||
 | 
						t.Log(string(dump))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if simpleStorage.updated == nil || simpleStorage.updated.Labels["foo"] != "bar" {
 | 
				
			||||||
 | 
							t.Errorf("Unexpected update value %#v, expected %#v.", simpleStorage.updated, item)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !selfLinker.called {
 | 
				
			||||||
 | 
							t.Errorf("Never set self link")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPatchRequiresMatchingName(t *testing.T) {
 | 
				
			||||||
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
 | 
						ID := "id"
 | 
				
			||||||
 | 
						item := &genericapitesting.Simple{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:      ID,
 | 
				
			||||||
 | 
								Namespace: "", // update should allow the client to send an empty namespace
 | 
				
			||||||
 | 
								UID:       "uid",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Other: "bar",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						simpleStorage := SimpleRESTStorage{item: *item}
 | 
				
			||||||
 | 
						storage["simple"] = &simpleStorage
 | 
				
			||||||
 | 
						handler := handle(storage)
 | 
				
			||||||
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
						request, err := http.NewRequest("PATCH", server.URL+"/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/namespaces/default/simple/"+ID, bytes.NewReader([]byte(`{"metadata":{"name":"idbar"}}`)))
 | 
				
			||||||
 | 
						request.Header.Set("Content-Type", "application/merge-patch+json")
 | 
				
			||||||
 | 
						response, err := client.Do(request)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if response.StatusCode != http.StatusBadRequest {
 | 
				
			||||||
 | 
							t.Errorf("Unexpected response %#v", response)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user