mirror of
https://github.com/grafana/grafana.git
synced 2024-12-28 18:01:40 -06:00
119 lines
2.7 KiB
Go
119 lines
2.7 KiB
Go
package web
|
|
|
|
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 any `binding:"Required"`
|
|
}
|
|
type StructWithSliceInts struct {
|
|
A []int `binding:"Required"`
|
|
}
|
|
type StructWithSliceStructs struct {
|
|
A []StructWithInt `binding:"Required"`
|
|
}
|
|
type StructWithSliceInterfaces struct {
|
|
A []any `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
|
|
}
|
|
|
|
type StructWithPointerValidation struct {
|
|
A int
|
|
}
|
|
|
|
func (sv *StructWithPointerValidation) Validate() error {
|
|
if sv.A < 10 {
|
|
return errors.New("too small")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestValidationSuccess(t *testing.T) {
|
|
var nilInterface *StructWithPointerValidation
|
|
|
|
for _, x := range []any{
|
|
nil,
|
|
42,
|
|
"foo",
|
|
struct{ A int }{},
|
|
StructWithInt{42},
|
|
StructWithPrimitives{42, "foo", true, 12.34},
|
|
StructWithPrivateFields{12, 0},
|
|
StructWithInterface{"foo"},
|
|
StructWithSliceInts{[]int{1, 2, 3}},
|
|
StructWithSliceInterfaces{[]any{1, 2, 3}},
|
|
StructWithSliceStructs{[]StructWithInt{{1}, {2}}},
|
|
StructWithStruct{StructWithInt{3}},
|
|
StructWithStructPointer{&StructWithInt{3}},
|
|
StructWithValidation{42},
|
|
&StructWithPointerValidation{42},
|
|
nilInterface,
|
|
} {
|
|
if err := validate(x); err != nil {
|
|
t.Error("Validation failed:", x, err)
|
|
}
|
|
}
|
|
}
|
|
func TestValidationFailure(t *testing.T) {
|
|
for i, x := range []any{
|
|
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{[]any{}},
|
|
StructWithSliceInterfaces{nil},
|
|
StructWithStruct{StructWithInt{}},
|
|
StructWithStruct{StructWithInt{0}},
|
|
StructWithStructPointer{},
|
|
StructWithStructPointer{&StructWithInt{}},
|
|
StructWithValidation{2},
|
|
&StructWithPointerValidation{2},
|
|
} {
|
|
if err := validate(x); err == nil {
|
|
t.Error("Validation should fail:", i, x)
|
|
}
|
|
}
|
|
}
|