165 lines
5.3 KiB
Go
165 lines
5.3 KiB
Go
package jsonschema_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.vaala.cloud/VaalaCat/go-openai/jsonschema"
|
|
)
|
|
|
|
func Test_Validate(t *testing.T) {
|
|
type args struct {
|
|
data any
|
|
schema jsonschema.Definition
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want bool
|
|
}{
|
|
// string integer number boolean
|
|
{"", args{data: "ABC", schema: jsonschema.Definition{Type: jsonschema.String}}, true},
|
|
{"", args{data: 123, schema: jsonschema.Definition{Type: jsonschema.String}}, false},
|
|
{"", args{data: 123, schema: jsonschema.Definition{Type: jsonschema.Integer}}, true},
|
|
{"", args{data: 123.4, schema: jsonschema.Definition{Type: jsonschema.Integer}}, false},
|
|
{"", args{data: "ABC", schema: jsonschema.Definition{Type: jsonschema.Number}}, false},
|
|
{"", args{data: 123, schema: jsonschema.Definition{Type: jsonschema.Number}}, true},
|
|
{"", args{data: false, schema: jsonschema.Definition{Type: jsonschema.Boolean}}, true},
|
|
{"", args{data: 123, schema: jsonschema.Definition{Type: jsonschema.Boolean}}, false},
|
|
{"", args{data: nil, schema: jsonschema.Definition{Type: jsonschema.Null}}, true},
|
|
{"", args{data: 0, schema: jsonschema.Definition{Type: jsonschema.Null}}, false},
|
|
// array
|
|
{"", args{data: []any{"a", "b", "c"}, schema: jsonschema.Definition{
|
|
Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.String}},
|
|
}, true},
|
|
{"", args{data: []any{1, 2, 3}, schema: jsonschema.Definition{
|
|
Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.String}},
|
|
}, false},
|
|
{"", args{data: []any{1, 2, 3}, schema: jsonschema.Definition{
|
|
Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.Integer}},
|
|
}, true},
|
|
{"", args{data: []any{1, 2, 3.4}, schema: jsonschema.Definition{
|
|
Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.Integer}},
|
|
}, false},
|
|
// object
|
|
{"", args{data: map[string]any{
|
|
"string": "abc",
|
|
"integer": 123,
|
|
"number": 123.4,
|
|
"boolean": false,
|
|
"array": []any{1, 2, 3},
|
|
}, schema: jsonschema.Definition{Type: jsonschema.Object, Properties: map[string]jsonschema.Definition{
|
|
"string": {Type: jsonschema.String},
|
|
"integer": {Type: jsonschema.Integer},
|
|
"number": {Type: jsonschema.Number},
|
|
"boolean": {Type: jsonschema.Boolean},
|
|
"array": {Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.Number}},
|
|
},
|
|
Required: []string{"string"},
|
|
}}, true},
|
|
{"", args{data: map[string]any{
|
|
"integer": 123,
|
|
"number": 123.4,
|
|
"boolean": false,
|
|
"array": []any{1, 2, 3},
|
|
}, schema: jsonschema.Definition{Type: jsonschema.Object, Properties: map[string]jsonschema.Definition{
|
|
"string": {Type: jsonschema.String},
|
|
"integer": {Type: jsonschema.Integer},
|
|
"number": {Type: jsonschema.Number},
|
|
"boolean": {Type: jsonschema.Boolean},
|
|
"array": {Type: jsonschema.Array, Items: &jsonschema.Definition{Type: jsonschema.Number}},
|
|
},
|
|
Required: []string{"string"},
|
|
}}, false},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := jsonschema.Validate(tt.args.schema, tt.args.data); got != tt.want {
|
|
t.Errorf("Validate() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUnmarshal(t *testing.T) {
|
|
type args struct {
|
|
schema jsonschema.Definition
|
|
content []byte
|
|
v any
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
wantErr bool
|
|
}{
|
|
{"", args{
|
|
schema: jsonschema.Definition{
|
|
Type: jsonschema.Object,
|
|
Properties: map[string]jsonschema.Definition{
|
|
"string": {Type: jsonschema.String},
|
|
"number": {Type: jsonschema.Number},
|
|
},
|
|
},
|
|
content: []byte(`{"string":"abc","number":123.4}`),
|
|
v: &struct {
|
|
String string `json:"string"`
|
|
Number float64 `json:"number"`
|
|
}{},
|
|
}, false},
|
|
{"", args{
|
|
schema: jsonschema.Definition{
|
|
Type: jsonschema.Object,
|
|
Properties: map[string]jsonschema.Definition{
|
|
"string": {Type: jsonschema.String},
|
|
"number": {Type: jsonschema.Number},
|
|
},
|
|
Required: []string{"string", "number"},
|
|
},
|
|
content: []byte(`{"string":"abc"}`),
|
|
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 {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := jsonschema.VerifySchemaAndUnmarshal(tt.args.schema, tt.args.content, tt.args.v)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("Unmarshal() error = %v, wantErr %v", err, tt.wantErr)
|
|
} else if err == nil {
|
|
t.Logf("Unmarshal() v = %+v\n", tt.args.v)
|
|
}
|
|
})
|
|
}
|
|
}
|