删除 test
This commit is contained in:
		
							parent
							
								
									0d83cfc042
								
							
						
					
					
						commit
						ceabec997c
					
				|  | @ -1,67 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team.  All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var form = map[string][]string{ |  | ||||||
| 	"name":      {"mike"}, |  | ||||||
| 	"friends":   {"anna", "nicole"}, |  | ||||||
| 	"id_number": {"12345678"}, |  | ||||||
| 	"id_date":   {"2018-01-20"}, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type structFull struct { |  | ||||||
| 	Name    string   `form:"name"` |  | ||||||
| 	Age     int      `form:"age,default=25"` |  | ||||||
| 	Friends []string `form:"friends"` |  | ||||||
| 	ID      *struct { |  | ||||||
| 		Number      string    `form:"id_number"` |  | ||||||
| 		DateOfIssue time.Time `form:"id_date" time_format:"2006-01-02" time_utc:"true"` |  | ||||||
| 	} |  | ||||||
| 	Nationality *string `form:"nationality"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func BenchmarkMapFormFull(b *testing.B) { |  | ||||||
| 	var s structFull |  | ||||||
| 	for i := 0; i < b.N; i++ { |  | ||||||
| 		err := mapForm(&s, form) |  | ||||||
| 		if err != nil { |  | ||||||
| 			b.Fatalf("Error on a form mapping") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	b.StopTimer() |  | ||||||
| 
 |  | ||||||
| 	t := b |  | ||||||
| 	assert.Equal(t, "mike", s.Name) |  | ||||||
| 	assert.Equal(t, 25, s.Age) |  | ||||||
| 	assert.Equal(t, []string{"anna", "nicole"}, s.Friends) |  | ||||||
| 	assert.Equal(t, "12345678", s.ID.Number) |  | ||||||
| 	assert.Equal(t, time.Date(2018, 1, 20, 0, 0, 0, 0, time.UTC), s.ID.DateOfIssue) |  | ||||||
| 	assert.Nil(t, s.Nationality) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type structName struct { |  | ||||||
| 	Name string `form:"name"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func BenchmarkMapFormName(b *testing.B) { |  | ||||||
| 	var s structName |  | ||||||
| 	for i := 0; i < b.N; i++ { |  | ||||||
| 		err := mapForm(&s, form) |  | ||||||
| 		if err != nil { |  | ||||||
| 			b.Fatalf("Error on a form mapping") |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	b.StopTimer() |  | ||||||
| 
 |  | ||||||
| 	t := b |  | ||||||
| 	assert.Equal(t, "mike", s.Name) |  | ||||||
| } |  | ||||||
|  | @ -1,281 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"reflect" |  | ||||||
| 	"testing" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestMappingBaseTypes(t *testing.T) { |  | ||||||
| 	intPtr := func(i int) *int { |  | ||||||
| 		return &i |  | ||||||
| 	} |  | ||||||
| 	for _, tt := range []struct { |  | ||||||
| 		name   string |  | ||||||
| 		value  interface{} |  | ||||||
| 		form   string |  | ||||||
| 		expect interface{} |  | ||||||
| 	}{ |  | ||||||
| 		{"base type", struct{ F int }{}, "9", int(9)}, |  | ||||||
| 		{"base type", struct{ F int8 }{}, "9", int8(9)}, |  | ||||||
| 		{"base type", struct{ F int16 }{}, "9", int16(9)}, |  | ||||||
| 		{"base type", struct{ F int32 }{}, "9", int32(9)}, |  | ||||||
| 		{"base type", struct{ F int64 }{}, "9", int64(9)}, |  | ||||||
| 		{"base type", struct{ F uint }{}, "9", uint(9)}, |  | ||||||
| 		{"base type", struct{ F uint8 }{}, "9", uint8(9)}, |  | ||||||
| 		{"base type", struct{ F uint16 }{}, "9", uint16(9)}, |  | ||||||
| 		{"base type", struct{ F uint32 }{}, "9", uint32(9)}, |  | ||||||
| 		{"base type", struct{ F uint64 }{}, "9", uint64(9)}, |  | ||||||
| 		{"base type", struct{ F bool }{}, "True", true}, |  | ||||||
| 		{"base type", struct{ F float32 }{}, "9.1", float32(9.1)}, |  | ||||||
| 		{"base type", struct{ F float64 }{}, "9.1", float64(9.1)}, |  | ||||||
| 		{"base type", struct{ F string }{}, "test", string("test")}, |  | ||||||
| 		{"base type", struct{ F *int }{}, "9", intPtr(9)}, |  | ||||||
| 
 |  | ||||||
| 		// zero values
 |  | ||||||
| 		{"zero value", struct{ F int }{}, "", int(0)}, |  | ||||||
| 		{"zero value", struct{ F uint }{}, "", uint(0)}, |  | ||||||
| 		{"zero value", struct{ F bool }{}, "", false}, |  | ||||||
| 		{"zero value", struct{ F float32 }{}, "", float32(0)}, |  | ||||||
| 	} { |  | ||||||
| 		tp := reflect.TypeOf(tt.value) |  | ||||||
| 		testName := tt.name + ":" + tp.Field(0).Type.String() |  | ||||||
| 
 |  | ||||||
| 		val := reflect.New(reflect.TypeOf(tt.value)) |  | ||||||
| 		val.Elem().Set(reflect.ValueOf(tt.value)) |  | ||||||
| 
 |  | ||||||
| 		field := val.Elem().Type().Field(0) |  | ||||||
| 
 |  | ||||||
| 		_, err := mapping(val, emptyField, formSource{field.Name: {tt.form}}, "form") |  | ||||||
| 		assert.NoError(t, err, testName) |  | ||||||
| 
 |  | ||||||
| 		actual := val.Elem().Field(0).Interface() |  | ||||||
| 		assert.Equal(t, tt.expect, actual, testName) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingDefault(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Int   int    `form:",default=9"` |  | ||||||
| 		Slice []int  `form:",default=9"` |  | ||||||
| 		Array [1]int `form:",default=9"` |  | ||||||
| 	} |  | ||||||
| 	err := mappingByPtr(&s, formSource{}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, 9, s.Int) |  | ||||||
| 	assert.Equal(t, []int{9}, s.Slice) |  | ||||||
| 	assert.Equal(t, [1]int{9}, s.Array) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingSkipField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		A int |  | ||||||
| 	} |  | ||||||
| 	err := mappingByPtr(&s, formSource{}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, 0, s.A) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingIgnoreField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		A int `form:"A"` |  | ||||||
| 		B int `form:"-"` |  | ||||||
| 	} |  | ||||||
| 	err := mappingByPtr(&s, formSource{"A": {"9"}, "B": {"9"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, 9, s.A) |  | ||||||
| 	assert.Equal(t, 0, s.B) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingUnexportedField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		A int `form:"a"` |  | ||||||
| 		b int `form:"b"` |  | ||||||
| 	} |  | ||||||
| 	err := mappingByPtr(&s, formSource{"a": {"9"}, "b": {"9"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, 9, s.A) |  | ||||||
| 	assert.Equal(t, 0, s.b) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingPrivateField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		f int `form:"field"` |  | ||||||
| 	} |  | ||||||
| 	err := mappingByPtr(&s, formSource{"field": {"6"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, int(0), s.f) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingUnknownFieldType(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		U uintptr |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{"U": {"unknown"}}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 	assert.Equal(t, errUnknownType, err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingURI(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		F int `uri:"field"` |  | ||||||
| 	} |  | ||||||
| 	err := mapUri(&s, map[string][]string{"field": {"6"}}) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, int(6), s.F) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingForm(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		F int `form:"field"` |  | ||||||
| 	} |  | ||||||
| 	err := mapForm(&s, map[string][]string{"field": {"6"}}) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, int(6), s.F) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingTime(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Time      time.Time |  | ||||||
| 		LocalTime time.Time `time_format:"2006-01-02"` |  | ||||||
| 		ZeroValue time.Time |  | ||||||
| 		CSTTime   time.Time `time_format:"2006-01-02" time_location:"Asia/Shanghai"` |  | ||||||
| 		UTCTime   time.Time `time_format:"2006-01-02" time_utc:"1"` |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var err error |  | ||||||
| 	time.Local, err = time.LoadLocation("Europe/Berlin") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	err = mapForm(&s, map[string][]string{ |  | ||||||
| 		"Time":      {"2019-01-20T16:02:58Z"}, |  | ||||||
| 		"LocalTime": {"2019-01-20"}, |  | ||||||
| 		"ZeroValue": {}, |  | ||||||
| 		"CSTTime":   {"2019-01-20"}, |  | ||||||
| 		"UTCTime":   {"2019-01-20"}, |  | ||||||
| 	}) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, "2019-01-20 16:02:58 +0000 UTC", s.Time.String()) |  | ||||||
| 	assert.Equal(t, "2019-01-20 00:00:00 +0100 CET", s.LocalTime.String()) |  | ||||||
| 	assert.Equal(t, "2019-01-19 23:00:00 +0000 UTC", s.LocalTime.UTC().String()) |  | ||||||
| 	assert.Equal(t, "0001-01-01 00:00:00 +0000 UTC", s.ZeroValue.String()) |  | ||||||
| 	assert.Equal(t, "2019-01-20 00:00:00 +0800 CST", s.CSTTime.String()) |  | ||||||
| 	assert.Equal(t, "2019-01-19 16:00:00 +0000 UTC", s.CSTTime.UTC().String()) |  | ||||||
| 	assert.Equal(t, "2019-01-20 00:00:00 +0000 UTC", s.UTCTime.String()) |  | ||||||
| 
 |  | ||||||
| 	// wrong location
 |  | ||||||
| 	var wrongLoc struct { |  | ||||||
| 		Time time.Time `time_location:"wrong"` |  | ||||||
| 	} |  | ||||||
| 	err = mapForm(&wrongLoc, map[string][]string{"Time": {"2019-01-20T16:02:58Z"}}) |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 
 |  | ||||||
| 	// wrong time value
 |  | ||||||
| 	var wrongTime struct { |  | ||||||
| 		Time time.Time |  | ||||||
| 	} |  | ||||||
| 	err = mapForm(&wrongTime, map[string][]string{"Time": {"wrong"}}) |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingTimeDuration(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		D time.Duration |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// ok
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{"D": {"5s"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, 5*time.Second, s.D) |  | ||||||
| 
 |  | ||||||
| 	// error
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"D": {"wrong"}}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingSlice(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Slice []int `form:"slice,default=9"` |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// default value
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, []int{9}, s.Slice) |  | ||||||
| 
 |  | ||||||
| 	// ok
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"slice": {"3", "4"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, []int{3, 4}, s.Slice) |  | ||||||
| 
 |  | ||||||
| 	// error
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"slice": {"wrong"}}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingArray(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Array [2]int `form:"array,default=9"` |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// wrong default
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 
 |  | ||||||
| 	// ok
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"array": {"3", "4"}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, [2]int{3, 4}, s.Array) |  | ||||||
| 
 |  | ||||||
| 	// error - not enough vals
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"array": {"3"}}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 
 |  | ||||||
| 	// error - wrong value
 |  | ||||||
| 	err = mappingByPtr(&s, formSource{"array": {"wrong"}}, "form") |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingStructField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		J struct { |  | ||||||
| 			I int |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{"J": {`{"I": 9}`}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, 9, s.J.I) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingMapField(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		M map[string]int |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{"M": {`{"one": 1}`}}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, map[string]int{"one": 1}, s.M) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestMappingIgnoredCircularRef(t *testing.T) { |  | ||||||
| 	type S struct { |  | ||||||
| 		S *S `form:"-"` |  | ||||||
| 	} |  | ||||||
| 	var s S |  | ||||||
| 
 |  | ||||||
| 	err := mappingByPtr(&s, formSource{}, "form") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| } |  | ||||||
|  | @ -1,30 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| 	"github.com/stretchr/testify/require" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestJSONBindingBindBody(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Foo string `json:"foo"` |  | ||||||
| 	} |  | ||||||
| 	err := jsonBinding{}.BindBody([]byte(`{"foo": "FOO"}`), &s) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	assert.Equal(t, "FOO", s.Foo) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestJSONBindingBindBodyMap(t *testing.T) { |  | ||||||
| 	s := make(map[string]string) |  | ||||||
| 	err := jsonBinding{}.BindBody([]byte(`{"foo": "FOO","hello":"world"}`), &s) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	assert.Len(t, s, 2) |  | ||||||
| 	assert.Equal(t, "FOO", s["foo"]) |  | ||||||
| 	assert.Equal(t, "world", s["hello"]) |  | ||||||
| } |  | ||||||
|  | @ -1,34 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| // +build !nomsgpack
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"testing" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| 	"github.com/stretchr/testify/require" |  | ||||||
| 	"github.com/ugorji/go/codec" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestMsgpackBindingBindBody(t *testing.T) { |  | ||||||
| 	type teststruct struct { |  | ||||||
| 		Foo string `msgpack:"foo"` |  | ||||||
| 	} |  | ||||||
| 	var s teststruct |  | ||||||
| 	err := msgpackBinding{}.BindBody(msgpackBody(t, teststruct{"FOO"}), &s) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	assert.Equal(t, "FOO", s.Foo) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func msgpackBody(t *testing.T, obj interface{}) []byte { |  | ||||||
| 	var bs bytes.Buffer |  | ||||||
| 	h := &codec.MsgpackHandle{} |  | ||||||
| 	err := codec.NewEncoder(&bs, h).Encode(obj) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	return bs.Bytes() |  | ||||||
| } |  | ||||||
|  | @ -1,138 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team.  All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"mime/multipart" |  | ||||||
| 	"net/http" |  | ||||||
| 	"testing" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestFormMultipartBindingBindOneFile(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		FileValue   multipart.FileHeader     `form:"file"` |  | ||||||
| 		FilePtr     *multipart.FileHeader    `form:"file"` |  | ||||||
| 		SliceValues []multipart.FileHeader   `form:"file"` |  | ||||||
| 		SlicePtrs   []*multipart.FileHeader  `form:"file"` |  | ||||||
| 		ArrayValues [1]multipart.FileHeader  `form:"file"` |  | ||||||
| 		ArrayPtrs   [1]*multipart.FileHeader `form:"file"` |  | ||||||
| 	} |  | ||||||
| 	file := testFile{"file", "file1", []byte("hello")} |  | ||||||
| 
 |  | ||||||
| 	req := createRequestMultipartFiles(t, file) |  | ||||||
| 	err := FormMultipart.Bind(req, &s) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assertMultipartFileHeader(t, &s.FileValue, file) |  | ||||||
| 	assertMultipartFileHeader(t, s.FilePtr, file) |  | ||||||
| 	assert.Len(t, s.SliceValues, 1) |  | ||||||
| 	assertMultipartFileHeader(t, &s.SliceValues[0], file) |  | ||||||
| 	assert.Len(t, s.SlicePtrs, 1) |  | ||||||
| 	assertMultipartFileHeader(t, s.SlicePtrs[0], file) |  | ||||||
| 	assertMultipartFileHeader(t, &s.ArrayValues[0], file) |  | ||||||
| 	assertMultipartFileHeader(t, s.ArrayPtrs[0], file) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFormMultipartBindingBindTwoFiles(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		SliceValues []multipart.FileHeader   `form:"file"` |  | ||||||
| 		SlicePtrs   []*multipart.FileHeader  `form:"file"` |  | ||||||
| 		ArrayValues [2]multipart.FileHeader  `form:"file"` |  | ||||||
| 		ArrayPtrs   [2]*multipart.FileHeader `form:"file"` |  | ||||||
| 	} |  | ||||||
| 	files := []testFile{ |  | ||||||
| 		{"file", "file1", []byte("hello")}, |  | ||||||
| 		{"file", "file2", []byte("world")}, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	req := createRequestMultipartFiles(t, files...) |  | ||||||
| 	err := FormMultipart.Bind(req, &s) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	assert.Len(t, s.SliceValues, len(files)) |  | ||||||
| 	assert.Len(t, s.SlicePtrs, len(files)) |  | ||||||
| 	assert.Len(t, s.ArrayValues, len(files)) |  | ||||||
| 	assert.Len(t, s.ArrayPtrs, len(files)) |  | ||||||
| 
 |  | ||||||
| 	for i, file := range files { |  | ||||||
| 		assertMultipartFileHeader(t, &s.SliceValues[i], file) |  | ||||||
| 		assertMultipartFileHeader(t, s.SlicePtrs[i], file) |  | ||||||
| 		assertMultipartFileHeader(t, &s.ArrayValues[i], file) |  | ||||||
| 		assertMultipartFileHeader(t, s.ArrayPtrs[i], file) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestFormMultipartBindingBindError(t *testing.T) { |  | ||||||
| 	files := []testFile{ |  | ||||||
| 		{"file", "file1", []byte("hello")}, |  | ||||||
| 		{"file", "file2", []byte("world")}, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, tt := range []struct { |  | ||||||
| 		name string |  | ||||||
| 		s    interface{} |  | ||||||
| 	}{ |  | ||||||
| 		{"wrong type", &struct { |  | ||||||
| 			Files int `form:"file"` |  | ||||||
| 		}{}}, |  | ||||||
| 		{"wrong array size", &struct { |  | ||||||
| 			Files [1]*multipart.FileHeader `form:"file"` |  | ||||||
| 		}{}}, |  | ||||||
| 		{"wrong slice type", &struct { |  | ||||||
| 			Files []int `form:"file"` |  | ||||||
| 		}{}}, |  | ||||||
| 	} { |  | ||||||
| 		req := createRequestMultipartFiles(t, files...) |  | ||||||
| 		err := FormMultipart.Bind(req, tt.s) |  | ||||||
| 		assert.Error(t, err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type testFile struct { |  | ||||||
| 	Fieldname string |  | ||||||
| 	Filename  string |  | ||||||
| 	Content   []byte |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func createRequestMultipartFiles(t *testing.T, files ...testFile) *http.Request { |  | ||||||
| 	var body bytes.Buffer |  | ||||||
| 
 |  | ||||||
| 	mw := multipart.NewWriter(&body) |  | ||||||
| 	for _, file := range files { |  | ||||||
| 		fw, err := mw.CreateFormFile(file.Fieldname, file.Filename) |  | ||||||
| 		assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 		n, err := fw.Write(file.Content) |  | ||||||
| 		assert.NoError(t, err) |  | ||||||
| 		assert.Equal(t, len(file.Content), n) |  | ||||||
| 	} |  | ||||||
| 	err := mw.Close() |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	req, err := http.NewRequest("POST", "/", &body) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+mw.Boundary()) |  | ||||||
| 	return req |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func assertMultipartFileHeader(t *testing.T, fh *multipart.FileHeader, file testFile) { |  | ||||||
| 	assert.Equal(t, file.Filename, fh.Filename) |  | ||||||
| 	// assert.Equal(t, int64(len(file.Content)), fh.Size) // fh.Size does not exist on go1.8
 |  | ||||||
| 
 |  | ||||||
| 	fl, err := fh.Open() |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 
 |  | ||||||
| 	body, err := ioutil.ReadAll(fl) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.Equal(t, string(file.Content), string(body)) |  | ||||||
| 
 |  | ||||||
| 	err = fl.Close() |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| } |  | ||||||
|  | @ -1,228 +0,0 @@ | ||||||
| // Copyright 2014 Manu Martinez-Almeida.  All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"testing" |  | ||||||
| 	"time" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| 	"go-playground/validator/v10" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type testInterface interface { |  | ||||||
| 	String() string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type substructNoValidation struct { |  | ||||||
| 	IString string |  | ||||||
| 	IInt    int |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type mapNoValidationSub map[string]substructNoValidation |  | ||||||
| 
 |  | ||||||
| type structNoValidationValues struct { |  | ||||||
| 	substructNoValidation |  | ||||||
| 
 |  | ||||||
| 	Boolean bool |  | ||||||
| 
 |  | ||||||
| 	Uinteger   uint |  | ||||||
| 	Integer    int |  | ||||||
| 	Integer8   int8 |  | ||||||
| 	Integer16  int16 |  | ||||||
| 	Integer32  int32 |  | ||||||
| 	Integer64  int64 |  | ||||||
| 	Uinteger8  uint8 |  | ||||||
| 	Uinteger16 uint16 |  | ||||||
| 	Uinteger32 uint32 |  | ||||||
| 	Uinteger64 uint64 |  | ||||||
| 
 |  | ||||||
| 	Float32 float32 |  | ||||||
| 	Float64 float64 |  | ||||||
| 
 |  | ||||||
| 	String string |  | ||||||
| 
 |  | ||||||
| 	Date time.Time |  | ||||||
| 
 |  | ||||||
| 	Struct        substructNoValidation |  | ||||||
| 	InlinedStruct struct { |  | ||||||
| 		String  []string |  | ||||||
| 		Integer int |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	IntSlice           []int |  | ||||||
| 	IntPointerSlice    []*int |  | ||||||
| 	StructPointerSlice []*substructNoValidation |  | ||||||
| 	StructSlice        []substructNoValidation |  | ||||||
| 	InterfaceSlice     []testInterface |  | ||||||
| 
 |  | ||||||
| 	UniversalInterface interface{} |  | ||||||
| 	CustomInterface    testInterface |  | ||||||
| 
 |  | ||||||
| 	FloatMap  map[string]float32 |  | ||||||
| 	StructMap mapNoValidationSub |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func createNoValidationValues() structNoValidationValues { |  | ||||||
| 	integer := 1 |  | ||||||
| 	s := structNoValidationValues{ |  | ||||||
| 		Boolean:            true, |  | ||||||
| 		Uinteger:           1 << 29, |  | ||||||
| 		Integer:            -10000, |  | ||||||
| 		Integer8:           120, |  | ||||||
| 		Integer16:          -20000, |  | ||||||
| 		Integer32:          1 << 29, |  | ||||||
| 		Integer64:          1 << 61, |  | ||||||
| 		Uinteger8:          250, |  | ||||||
| 		Uinteger16:         50000, |  | ||||||
| 		Uinteger32:         1 << 31, |  | ||||||
| 		Uinteger64:         1 << 62, |  | ||||||
| 		Float32:            123.456, |  | ||||||
| 		Float64:            123.456789, |  | ||||||
| 		String:             "text", |  | ||||||
| 		Date:               time.Time{}, |  | ||||||
| 		CustomInterface:    &bytes.Buffer{}, |  | ||||||
| 		Struct:             substructNoValidation{}, |  | ||||||
| 		IntSlice:           []int{-3, -2, 1, 0, 1, 2, 3}, |  | ||||||
| 		IntPointerSlice:    []*int{&integer}, |  | ||||||
| 		StructSlice:        []substructNoValidation{}, |  | ||||||
| 		UniversalInterface: 1.2, |  | ||||||
| 		FloatMap: map[string]float32{ |  | ||||||
| 			"foo": 1.23, |  | ||||||
| 			"bar": 232.323, |  | ||||||
| 		}, |  | ||||||
| 		StructMap: mapNoValidationSub{ |  | ||||||
| 			"foo": substructNoValidation{}, |  | ||||||
| 			"bar": substructNoValidation{}, |  | ||||||
| 		}, |  | ||||||
| 		// StructPointerSlice []noValidationSub
 |  | ||||||
| 		// InterfaceSlice     []testInterface
 |  | ||||||
| 	} |  | ||||||
| 	s.InlinedStruct.Integer = 1000 |  | ||||||
| 	s.InlinedStruct.String = []string{"first", "second"} |  | ||||||
| 	s.IString = "substring" |  | ||||||
| 	s.IInt = 987654 |  | ||||||
| 	return s |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestValidateNoValidationValues(t *testing.T) { |  | ||||||
| 	origin := createNoValidationValues() |  | ||||||
| 	test := createNoValidationValues() |  | ||||||
| 	empty := structNoValidationValues{} |  | ||||||
| 
 |  | ||||||
| 	assert.Nil(t, validate(test)) |  | ||||||
| 	assert.Nil(t, validate(&test)) |  | ||||||
| 	assert.Nil(t, validate(empty)) |  | ||||||
| 	assert.Nil(t, validate(&empty)) |  | ||||||
| 
 |  | ||||||
| 	assert.Equal(t, origin, test) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type structNoValidationPointer struct { |  | ||||||
| 	substructNoValidation |  | ||||||
| 
 |  | ||||||
| 	Boolean bool |  | ||||||
| 
 |  | ||||||
| 	Uinteger   *uint |  | ||||||
| 	Integer    *int |  | ||||||
| 	Integer8   *int8 |  | ||||||
| 	Integer16  *int16 |  | ||||||
| 	Integer32  *int32 |  | ||||||
| 	Integer64  *int64 |  | ||||||
| 	Uinteger8  *uint8 |  | ||||||
| 	Uinteger16 *uint16 |  | ||||||
| 	Uinteger32 *uint32 |  | ||||||
| 	Uinteger64 *uint64 |  | ||||||
| 
 |  | ||||||
| 	Float32 *float32 |  | ||||||
| 	Float64 *float64 |  | ||||||
| 
 |  | ||||||
| 	String *string |  | ||||||
| 
 |  | ||||||
| 	Date *time.Time |  | ||||||
| 
 |  | ||||||
| 	Struct *substructNoValidation |  | ||||||
| 
 |  | ||||||
| 	IntSlice           *[]int |  | ||||||
| 	IntPointerSlice    *[]*int |  | ||||||
| 	StructPointerSlice *[]*substructNoValidation |  | ||||||
| 	StructSlice        *[]substructNoValidation |  | ||||||
| 	InterfaceSlice     *[]testInterface |  | ||||||
| 
 |  | ||||||
| 	FloatMap  *map[string]float32 |  | ||||||
| 	StructMap *mapNoValidationSub |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestValidateNoValidationPointers(t *testing.T) { |  | ||||||
| 	//origin := createNoValidation_values()
 |  | ||||||
| 	//test := createNoValidation_values()
 |  | ||||||
| 	empty := structNoValidationPointer{} |  | ||||||
| 
 |  | ||||||
| 	//assert.Nil(t, validate(test))
 |  | ||||||
| 	//assert.Nil(t, validate(&test))
 |  | ||||||
| 	assert.Nil(t, validate(empty)) |  | ||||||
| 	assert.Nil(t, validate(&empty)) |  | ||||||
| 
 |  | ||||||
| 	//assert.Equal(t, origin, test)
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Object map[string]interface{} |  | ||||||
| 
 |  | ||||||
| func TestValidatePrimitives(t *testing.T) { |  | ||||||
| 	obj := Object{"foo": "bar", "bar": 1} |  | ||||||
| 	assert.NoError(t, validate(obj)) |  | ||||||
| 	assert.NoError(t, validate(&obj)) |  | ||||||
| 	assert.Equal(t, Object{"foo": "bar", "bar": 1}, obj) |  | ||||||
| 
 |  | ||||||
| 	obj2 := []Object{{"foo": "bar", "bar": 1}, {"foo": "bar", "bar": 1}} |  | ||||||
| 	assert.NoError(t, validate(obj2)) |  | ||||||
| 	assert.NoError(t, validate(&obj2)) |  | ||||||
| 
 |  | ||||||
| 	nu := 10 |  | ||||||
| 	assert.NoError(t, validate(nu)) |  | ||||||
| 	assert.NoError(t, validate(&nu)) |  | ||||||
| 	assert.Equal(t, 10, nu) |  | ||||||
| 
 |  | ||||||
| 	str := "value" |  | ||||||
| 	assert.NoError(t, validate(str)) |  | ||||||
| 	assert.NoError(t, validate(&str)) |  | ||||||
| 	assert.Equal(t, "value", str) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // structCustomValidation is a helper struct we use to check that
 |  | ||||||
| // custom validation can be registered on it.
 |  | ||||||
| // The `notone` binding directive is for custom validation and registered later.
 |  | ||||||
| type structCustomValidation struct { |  | ||||||
| 	Integer int `binding:"notone"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func notOne(f1 validator.FieldLevel) bool { |  | ||||||
| 	if val, ok := f1.Field().Interface().(int); ok { |  | ||||||
| 		return val != 1 |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestValidatorEngine(t *testing.T) { |  | ||||||
| 	// This validates that the function `notOne` matches
 |  | ||||||
| 	// the expected function signature by `defaultValidator`
 |  | ||||||
| 	// and by extension the validator library.
 |  | ||||||
| 	engine, ok := Validator.Engine().(*validator.Validate) |  | ||||||
| 	assert.True(t, ok) |  | ||||||
| 
 |  | ||||||
| 	err := engine.RegisterValidation("notone", notOne) |  | ||||||
| 	// Check that we can register custom validation without error
 |  | ||||||
| 	assert.Nil(t, err) |  | ||||||
| 
 |  | ||||||
| 	// Create an instance which will fail validation
 |  | ||||||
| 	withOne := structCustomValidation{Integer: 1} |  | ||||||
| 	errs := validate(withOne) |  | ||||||
| 
 |  | ||||||
| 	// Check that we got back non-nil errs
 |  | ||||||
| 	assert.NotNil(t, errs) |  | ||||||
| 	// Check that the error matches expectation
 |  | ||||||
| 	assert.Error(t, errs, "", "", "notone") |  | ||||||
| } |  | ||||||
|  | @ -1,25 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| 	"github.com/stretchr/testify/require" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestXMLBindingBindBody(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Foo string `xml:"foo"` |  | ||||||
| 	} |  | ||||||
| 	xmlBody := `<?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <root> |  | ||||||
|    <foo>FOO</foo> |  | ||||||
| </root>` |  | ||||||
| 	err := xmlBinding{}.BindBody([]byte(xmlBody), &s) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	assert.Equal(t, "FOO", s.Foo) |  | ||||||
| } |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| // Copyright 2019 Gin Core Team. All rights reserved.
 |  | ||||||
| // Use of this source code is governed by a MIT style
 |  | ||||||
| // license that can be found in the LICENSE file.
 |  | ||||||
| 
 |  | ||||||
| package binding |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
| 
 |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| 	"github.com/stretchr/testify/require" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func TestYAMLBindingBindBody(t *testing.T) { |  | ||||||
| 	var s struct { |  | ||||||
| 		Foo string `yaml:"foo"` |  | ||||||
| 	} |  | ||||||
| 	err := yamlBinding{}.BindBody([]byte("foo: FOO"), &s) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
| 	assert.Equal(t, "FOO", s.Foo) |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue