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:
parent
3cb30679b5
commit
28e57f58b1
@ -261,6 +261,9 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][
|
|||||||
|
|
||||||
if len(vs) > 0 {
|
if len(vs) > 0 {
|
||||||
val = vs[0]
|
val = vs[0]
|
||||||
|
if val == "" {
|
||||||
|
val = opt.defaultValue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ok, err := trySetCustom(val, value); ok {
|
if ok, err := trySetCustom(val, value); ok {
|
||||||
return ok, err
|
return ok, err
|
||||||
|
@ -69,6 +69,7 @@ func TestMappingBaseTypes(t *testing.T) {
|
|||||||
|
|
||||||
func TestMappingDefault(t *testing.T) {
|
func TestMappingDefault(t *testing.T) {
|
||||||
var s struct {
|
var s struct {
|
||||||
|
Str string `form:",default=defaultVal"`
|
||||||
Int int `form:",default=9"`
|
Int int `form:",default=9"`
|
||||||
Slice []int `form:",default=9"`
|
Slice []int `form:",default=9"`
|
||||||
Array [1]int `form:",default=9"`
|
Array [1]int `form:",default=9"`
|
||||||
@ -76,6 +77,7 @@ func TestMappingDefault(t *testing.T) {
|
|||||||
err := mappingByPtr(&s, formSource{}, "form")
|
err := mappingByPtr(&s, formSource{}, "form")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, "defaultVal", s.Str)
|
||||||
assert.Equal(t, 9, s.Int)
|
assert.Equal(t, 9, s.Int)
|
||||||
assert.Equal(t, []int{9}, s.Slice)
|
assert.Equal(t, []int{9}, s.Slice)
|
||||||
assert.Equal(t, [1]int{9}, s.Array)
|
assert.Equal(t, [1]int{9}, s.Array)
|
||||||
@ -152,6 +154,24 @@ func TestMappingForm(t *testing.T) {
|
|||||||
assert.Equal(t, 6, s.F)
|
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) {
|
func TestMapFormWithTag(t *testing.T) {
|
||||||
var s struct {
|
var s struct {
|
||||||
F int `externalTag:"field"`
|
F int `externalTag:"field"`
|
||||||
|
Loading…
Reference in New Issue
Block a user