fix: jsonschema integer validation (#852)
This commit is contained in:
@@ -36,6 +36,10 @@ func Validate(schema Definition, data any) bool {
|
|||||||
_, ok := data.(bool)
|
_, ok := data.(bool)
|
||||||
return ok
|
return ok
|
||||||
case Integer:
|
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)
|
_, ok := data.(int)
|
||||||
return ok
|
return ok
|
||||||
case Null:
|
case Null:
|
||||||
|
|||||||
@@ -86,14 +86,6 @@ func TestUnmarshal(t *testing.T) {
|
|||||||
content []byte
|
content []byte
|
||||||
v any
|
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 {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args args
|
args args
|
||||||
@@ -108,7 +100,10 @@ func TestUnmarshal(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
content: []byte(`{"string":"abc","number":123.4}`),
|
content: []byte(`{"string":"abc","number":123.4}`),
|
||||||
v: &result1,
|
v: &struct {
|
||||||
|
String string `json:"string"`
|
||||||
|
Number float64 `json:"number"`
|
||||||
|
}{},
|
||||||
}, false},
|
}, false},
|
||||||
{"", args{
|
{"", args{
|
||||||
schema: jsonschema.Definition{
|
schema: jsonschema.Definition{
|
||||||
@@ -120,7 +115,40 @@ func TestUnmarshal(t *testing.T) {
|
|||||||
Required: []string{"string", "number"},
|
Required: []string{"string", "number"},
|
||||||
},
|
},
|
||||||
content: []byte(`{"string":"abc"}`),
|
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},
|
}, true},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|||||||
Reference in New Issue
Block a user