103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package rest_test | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"io" | ||
|  | 	"net/http" | ||
|  | 	"net/http/httptest" | ||
|  | 	"net/url" | ||
|  | 	"strings" | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/labstack/echo/v5" | ||
|  | 	"github.com/pocketbase/pocketbase/tools/rest" | ||
|  | ) | ||
|  | 
 | ||
|  | func TestBindBody(t *testing.T) { | ||
|  | 	scenarios := []struct { | ||
|  | 		body        io.Reader | ||
|  | 		contentType string | ||
|  | 		result      map[string]string | ||
|  | 		expectError bool | ||
|  | 	}{ | ||
|  | 		{ | ||
|  | 			strings.NewReader(""), | ||
|  | 			echo.MIMEApplicationJSON, | ||
|  | 			map[string]string{}, | ||
|  | 			false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			strings.NewReader(`{"test":"invalid`), | ||
|  | 			echo.MIMEApplicationJSON, | ||
|  | 			map[string]string{}, | ||
|  | 			true, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			strings.NewReader(`{"test":"test123"}`), | ||
|  | 			echo.MIMEApplicationJSON, | ||
|  | 			map[string]string{"test": "test123"}, | ||
|  | 			false, | ||
|  | 		}, | ||
|  | 		{ | ||
|  | 			strings.NewReader(url.Values{"test": []string{"test123"}}.Encode()), | ||
|  | 			echo.MIMEApplicationForm, | ||
|  | 			map[string]string{"test": "test123"}, | ||
|  | 			false, | ||
|  | 		}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for i, scenario := range scenarios { | ||
|  | 		e := echo.New() | ||
|  | 		req := httptest.NewRequest(http.MethodPost, "/", scenario.body) | ||
|  | 		req.Header.Set(echo.HeaderContentType, scenario.contentType) | ||
|  | 		rec := httptest.NewRecorder() | ||
|  | 		c := e.NewContext(req, rec) | ||
|  | 
 | ||
|  | 		result := map[string]string{} | ||
|  | 		err := rest.BindBody(c, &result) | ||
|  | 
 | ||
|  | 		if err == nil && scenario.expectError { | ||
|  | 			t.Errorf("(%d) Expected error, got nil", i) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if err != nil && !scenario.expectError { | ||
|  | 			t.Errorf("(%d) Expected nil, got error %v", i, err) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if len(result) != len(scenario.result) { | ||
|  | 			t.Errorf("(%d) Expected %v, got %v", i, scenario.result, result) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for k, v := range result { | ||
|  | 			if sv, ok := scenario.result[k]; !ok || v != sv { | ||
|  | 				t.Errorf("(%d) Expected value %v for key %s, got %v", i, sv, k, v) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func TestReadJsonBodyCopy(t *testing.T) { | ||
|  | 	req := httptest.NewRequest(http.MethodGet, "/", strings.NewReader(`{"test":"test123"}`)) | ||
|  | 
 | ||
|  | 	// simulate multiple reads from the same request
 | ||
|  | 	result1 := map[string]string{} | ||
|  | 	rest.ReadJsonBodyCopy(req, &result1) | ||
|  | 	result2 := map[string]string{} | ||
|  | 	rest.ReadJsonBodyCopy(req, &result2) | ||
|  | 
 | ||
|  | 	if len(result1) == 0 { | ||
|  | 		t.Error("Expected result1 to be filled") | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if len(result2) == 0 { | ||
|  | 		t.Error("Expected result2 to be filled") | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if v, ok := result1["test"]; !ok || v != "test123" { | ||
|  | 		t.Errorf("Expected result1.test to be %q, got %q", "test123", v) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if v, ok := result2["test"]; !ok || v != "test123" { | ||
|  | 		t.Errorf("Expected result2.test to be %q, got %q", "test123", v) | ||
|  | 	} | ||
|  | } |