fix: jsonschema integer validation (#852)
This commit is contained in:
@@ -36,6 +36,10 @@ func Validate(schema Definition, data any) bool {
|
||||
_, ok := data.(bool)
|
||||
return ok
|
||||
case Integer:
|
||||
// Golang unmarshals all numbers as float64, so we need to check if the float64 is an integer
|
||||
if num, ok := data.(float64); ok {
|
||||
return num == float64(int64(num))
|
||||
}
|
||||
_, ok := data.(int)
|
||||
return ok
|
||||
case Null:
|
||||
|
||||
@@ -86,14 +86,6 @@ func TestUnmarshal(t *testing.T) {
|
||||
content []byte
|
||||
v any
|
||||
}
|
||||
var result1 struct {
|
||||
String string `json:"string"`
|
||||
Number float64 `json:"number"`
|
||||
}
|
||||
var result2 struct {
|
||||
String string `json:"string"`
|
||||
Number float64 `json:"number"`
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
@@ -108,7 +100,10 @@ func TestUnmarshal(t *testing.T) {
|
||||
},
|
||||
},
|
||||
content: []byte(`{"string":"abc","number":123.4}`),
|
||||
v: &result1,
|
||||
v: &struct {
|
||||
String string `json:"string"`
|
||||
Number float64 `json:"number"`
|
||||
}{},
|
||||
}, false},
|
||||
{"", args{
|
||||
schema: jsonschema.Definition{
|
||||
@@ -120,7 +115,40 @@ func TestUnmarshal(t *testing.T) {
|
||||
Required: []string{"string", "number"},
|
||||
},
|
||||
content: []byte(`{"string":"abc"}`),
|
||||
v: result2,
|
||||
v: struct {
|
||||
String string `json:"string"`
|
||||
Number float64 `json:"number"`
|
||||
}{},
|
||||
}, true},
|
||||
{"validate integer", args{
|
||||
schema: jsonschema.Definition{
|
||||
Type: jsonschema.Object,
|
||||
Properties: map[string]jsonschema.Definition{
|
||||
"string": {Type: jsonschema.String},
|
||||
"integer": {Type: jsonschema.Integer},
|
||||
},
|
||||
Required: []string{"string", "integer"},
|
||||
},
|
||||
content: []byte(`{"string":"abc","integer":123}`),
|
||||
v: &struct {
|
||||
String string `json:"string"`
|
||||
Integer int `json:"integer"`
|
||||
}{},
|
||||
}, false},
|
||||
{"validate integer failed", args{
|
||||
schema: jsonschema.Definition{
|
||||
Type: jsonschema.Object,
|
||||
Properties: map[string]jsonschema.Definition{
|
||||
"string": {Type: jsonschema.String},
|
||||
"integer": {Type: jsonschema.Integer},
|
||||
},
|
||||
Required: []string{"string", "integer"},
|
||||
},
|
||||
content: []byte(`{"string":"abc","integer":123.4}`),
|
||||
v: &struct {
|
||||
String string `json:"string"`
|
||||
Integer int `json:"integer"`
|
||||
}{},
|
||||
}, true},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
|
||||
Reference in New Issue
Block a user