144 lines
3.3 KiB
Go
144 lines
3.3 KiB
Go
package schema
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateForKeyFields(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
keyFields []Field
|
|
key interface{}
|
|
errContains string
|
|
}{
|
|
{
|
|
name: "no key fields",
|
|
keyFields: nil,
|
|
key: nil,
|
|
},
|
|
{
|
|
name: "single key field, valid",
|
|
keyFields: object1Type.KeyFields,
|
|
key: "hello",
|
|
errContains: "",
|
|
},
|
|
{
|
|
name: "single key field, invalid",
|
|
keyFields: object1Type.KeyFields,
|
|
key: []interface{}{"value"},
|
|
errContains: "invalid value",
|
|
},
|
|
{
|
|
name: "multiple key fields, valid",
|
|
keyFields: object2Type.KeyFields,
|
|
key: []interface{}{"hello", int32(42)},
|
|
},
|
|
{
|
|
name: "multiple key fields, not a slice",
|
|
keyFields: object2Type.KeyFields,
|
|
key: map[string]interface{}{"field1": "hello", "field2": "42"},
|
|
errContains: "expected slice of values",
|
|
},
|
|
{
|
|
name: "multiple key fields, wrong number of values",
|
|
keyFields: object2Type.KeyFields,
|
|
key: []interface{}{"hello"},
|
|
errContains: "expected 2 key fields",
|
|
},
|
|
{
|
|
name: "multiple key fields, invalid value",
|
|
keyFields: object2Type.KeyFields,
|
|
key: []interface{}{"hello", "abc"},
|
|
errContains: "invalid value",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := ValidateObjectKey(tt.keyFields, tt.key, EmptyTypeSet())
|
|
if tt.errContains == "" {
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
} else {
|
|
if err == nil || !strings.Contains(err.Error(), tt.errContains) {
|
|
t.Fatalf("expected error to contain %q, got: %v", tt.errContains, err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestValidateForValueFields(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
valueFields []Field
|
|
value interface{}
|
|
errContains string
|
|
}{
|
|
{
|
|
name: "no value fields",
|
|
valueFields: nil,
|
|
value: nil,
|
|
},
|
|
{
|
|
name: "single value field, valid",
|
|
valueFields: []Field{
|
|
{
|
|
Name: "field1",
|
|
Kind: StringKind,
|
|
},
|
|
},
|
|
value: "hello",
|
|
errContains: "",
|
|
},
|
|
{
|
|
name: "value updates, empty",
|
|
valueFields: object3Type.ValueFields,
|
|
value: MapValueUpdates(map[string]interface{}{}),
|
|
},
|
|
{
|
|
name: "value updates, 1 field valid",
|
|
valueFields: object3Type.ValueFields,
|
|
value: MapValueUpdates(map[string]interface{}{
|
|
"field1": "hello",
|
|
}),
|
|
},
|
|
{
|
|
name: "value updates, 2 fields, 1 invalid",
|
|
valueFields: object3Type.ValueFields,
|
|
value: MapValueUpdates(map[string]interface{}{
|
|
"field1": "hello",
|
|
"field2": "abc",
|
|
}),
|
|
errContains: "expected int32",
|
|
},
|
|
{
|
|
name: "value updates, extra value",
|
|
valueFields: object3Type.ValueFields,
|
|
value: MapValueUpdates(map[string]interface{}{
|
|
"field1": "hello",
|
|
"field2": int32(42),
|
|
"field3": "extra",
|
|
}),
|
|
errContains: "unexpected values",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := ValidateObjectValue(tt.valueFields, tt.value, EmptyTypeSet())
|
|
if tt.errContains == "" {
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
} else {
|
|
if err == nil || !strings.Contains(err.Error(), tt.errContains) {
|
|
t.Fatalf("expected error to contain %q, got: %v", tt.errContains, err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|