fix(form): Set default value for form fields (#4047)
- Use specified default value in struct tags when binding a request input to struct for validation, even if sent empty, not only when not sent at all. - Add string field to `TestMappingDefault` test case. - Add test case for not sent form field to default to the value specified via code. - Add test case for form field sent empty to default to the value specified via code. Fixes: How to apply default value if empty value provided by client during model binding? #4042, #13042df, #a41721a
This commit is contained in:
		@ -261,6 +261,9 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][
 | 
			
		||||
 | 
			
		||||
		if len(vs) > 0 {
 | 
			
		||||
			val = vs[0]
 | 
			
		||||
			if val == "" {
 | 
			
		||||
				val = opt.defaultValue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if ok, err := trySetCustom(val, value); ok {
 | 
			
		||||
			return ok, err
 | 
			
		||||
 | 
			
		||||
@ -69,6 +69,7 @@ func TestMappingBaseTypes(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
func TestMappingDefault(t *testing.T) {
 | 
			
		||||
	var s struct {
 | 
			
		||||
		Str   string `form:",default=defaultVal"`
 | 
			
		||||
		Int   int    `form:",default=9"`
 | 
			
		||||
		Slice []int  `form:",default=9"`
 | 
			
		||||
		Array [1]int `form:",default=9"`
 | 
			
		||||
@ -76,6 +77,7 @@ func TestMappingDefault(t *testing.T) {
 | 
			
		||||
	err := mappingByPtr(&s, formSource{}, "form")
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, "defaultVal", s.Str)
 | 
			
		||||
	assert.Equal(t, 9, s.Int)
 | 
			
		||||
	assert.Equal(t, []int{9}, s.Slice)
 | 
			
		||||
	assert.Equal(t, [1]int{9}, s.Array)
 | 
			
		||||
@ -152,6 +154,24 @@ func TestMappingForm(t *testing.T) {
 | 
			
		||||
	assert.Equal(t, 6, s.F)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMappingFormFieldNotSent(t *testing.T) {
 | 
			
		||||
	var s struct {
 | 
			
		||||
		F string `form:"field,default=defVal"`
 | 
			
		||||
	}
 | 
			
		||||
	err := mapForm(&s, map[string][]string{})
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, "defVal", s.F)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMappingFormWithEmptyToDefault(t *testing.T) {
 | 
			
		||||
	var s struct {
 | 
			
		||||
		F string `form:"field,default=DefVal"`
 | 
			
		||||
	}
 | 
			
		||||
	err := mapForm(&s, map[string][]string{"field": {""}})
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, "DefVal", s.F)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMapFormWithTag(t *testing.T) {
 | 
			
		||||
	var s struct {
 | 
			
		||||
		F int `externalTag:"field"`
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user