mirror of
https://github.com/grafana/grafana.git
synced 2024-11-29 20:24:18 -06:00
3131388084
* rename Bind to BindMiddleware * make things private * removed unused part of data bindings * provide json and form binding helpers * add example of binding migration in login api * implement validation * fix tests * remove debug output * put new bind api into macaron pacakge * revert bind api breaking change
102 lines
2.5 KiB
Go
102 lines
2.5 KiB
Go
package macaron
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
type StructWithInt struct {
|
|
A int `binding:"Required"`
|
|
}
|
|
|
|
type StructWithPrimitives struct {
|
|
A int `binding:"Required"`
|
|
B string `binding:"Required"`
|
|
C bool `binding:"Required"`
|
|
D float64 `binding:"Required"`
|
|
}
|
|
|
|
type StructWithPrivateFields struct {
|
|
A int `binding:"Required"` // must be validated
|
|
b int `binding:"Required"` // will not be used
|
|
}
|
|
|
|
type StructWithInterface struct {
|
|
A interface{} `binding:"Required"`
|
|
}
|
|
type StructWithSliceInts struct {
|
|
A []int `binding:"Required"`
|
|
}
|
|
type StructWithSliceStructs struct {
|
|
A []StructWithInt `binding:"Required"`
|
|
}
|
|
type StructWithSliceInterfaces struct {
|
|
A []interface{} `binding:"Required"`
|
|
}
|
|
type StructWithStruct struct {
|
|
A StructWithInt `binding:"Required"`
|
|
}
|
|
type StructWithStructPointer struct {
|
|
A *StructWithInt `binding:"Required"`
|
|
}
|
|
type StructWithValidation struct {
|
|
A int
|
|
}
|
|
|
|
func (sv StructWithValidation) Validate() error {
|
|
if sv.A < 10 {
|
|
return errors.New("too small")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestValidationSuccess(t *testing.T) {
|
|
for _, x := range []interface{}{
|
|
42,
|
|
"foo",
|
|
struct{ A int }{},
|
|
StructWithInt{42},
|
|
StructWithPrimitives{42, "foo", true, 12.34},
|
|
StructWithPrivateFields{12, 0},
|
|
StructWithInterface{"foo"},
|
|
StructWithSliceInts{[]int{1, 2, 3}},
|
|
StructWithSliceInterfaces{[]interface{}{1, 2, 3}},
|
|
StructWithSliceStructs{[]StructWithInt{{1}, {2}}},
|
|
StructWithStruct{StructWithInt{3}},
|
|
StructWithStructPointer{&StructWithInt{3}},
|
|
StructWithValidation{42},
|
|
} {
|
|
if err := validate(x); err != nil {
|
|
t.Error("Validation failed:", x, err)
|
|
}
|
|
}
|
|
}
|
|
func TestValidationFailure(t *testing.T) {
|
|
for i, x := range []interface{}{
|
|
StructWithInt{0},
|
|
StructWithPrimitives{0, "foo", true, 12.34},
|
|
StructWithPrimitives{42, "", true, 12.34},
|
|
StructWithPrimitives{42, "foo", false, 12.34},
|
|
StructWithPrimitives{42, "foo", true, 0},
|
|
StructWithPrivateFields{0, 1},
|
|
StructWithInterface{},
|
|
StructWithInterface{nil},
|
|
StructWithSliceInts{},
|
|
StructWithSliceInts{[]int{}},
|
|
StructWithSliceStructs{[]StructWithInt{}},
|
|
StructWithSliceStructs{[]StructWithInt{{0}, {2}}},
|
|
StructWithSliceStructs{[]StructWithInt{{2}, {0}}},
|
|
StructWithSliceInterfaces{[]interface{}{}},
|
|
StructWithSliceInterfaces{nil},
|
|
StructWithStruct{StructWithInt{}},
|
|
StructWithStruct{StructWithInt{0}},
|
|
StructWithStructPointer{},
|
|
StructWithStructPointer{&StructWithInt{}},
|
|
StructWithValidation{2},
|
|
} {
|
|
if err := validate(x); err == nil {
|
|
t.Error("Validation should fail:", i, x)
|
|
}
|
|
}
|
|
}
|