1
0
mirror of https://github.com/pocketbase/pocketbase.git synced 2025-01-10 00:43:36 +02:00
pocketbase/tools/rest/multi_binder_test.go
2022-10-30 10:28:14 +02:00

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 TestCopyJsonBody(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/", strings.NewReader(`{"test":"test123"}`))
// simulate multiple reads from the same request
result1 := map[string]string{}
rest.CopyJsonBody(req, &result1)
result2 := map[string]string{}
rest.CopyJsonBody(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)
}
}