mirror of https://github.com/databricks/cli.git
314 lines
11 KiB
Go
314 lines
11 KiB
Go
package jsonschema
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestValidateInstanceAdditionalPropertiesPermitted(t *testing.T) {
|
|
instance := map[string]any{
|
|
"int_val": 1,
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
"an_additional_property": "abc",
|
|
}
|
|
|
|
schema, err := Load("./testdata/instance-validate/test-schema.json")
|
|
require.NoError(t, err)
|
|
|
|
err = schema.validateAdditionalProperties(instance)
|
|
assert.NoError(t, err)
|
|
|
|
err = schema.ValidateInstance(instance)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestValidateInstanceAdditionalPropertiesForbidden(t *testing.T) {
|
|
instance := map[string]any{
|
|
"int_val": 1,
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
"an_additional_property": "abc",
|
|
}
|
|
|
|
schema, err := Load("./testdata/instance-validate/test-schema-no-additional-properties.json")
|
|
require.NoError(t, err)
|
|
|
|
err = schema.validateAdditionalProperties(instance)
|
|
assert.EqualError(t, err, "property an_additional_property is not defined in the schema")
|
|
|
|
err = schema.ValidateInstance(instance)
|
|
assert.EqualError(t, err, "property an_additional_property is not defined in the schema")
|
|
|
|
instanceWOAdditionalProperties := map[string]any{
|
|
"int_val": 1,
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
}
|
|
|
|
err = schema.validateAdditionalProperties(instanceWOAdditionalProperties)
|
|
assert.NoError(t, err)
|
|
|
|
err = schema.ValidateInstance(instanceWOAdditionalProperties)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestValidateInstanceTypes(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema.json")
|
|
require.NoError(t, err)
|
|
|
|
validInstance := map[string]any{
|
|
"int_val": 1,
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
}
|
|
|
|
err = schema.validateTypes(validInstance)
|
|
assert.NoError(t, err)
|
|
|
|
err = schema.ValidateInstance(validInstance)
|
|
assert.NoError(t, err)
|
|
|
|
invalidInstance := map[string]any{
|
|
"int_val": "abc",
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
}
|
|
|
|
err = schema.validateTypes(invalidInstance)
|
|
assert.EqualError(t, err, "incorrect type for property int_val: expected type integer, but value is \"abc\"")
|
|
|
|
err = schema.ValidateInstance(invalidInstance)
|
|
assert.EqualError(t, err, "incorrect type for property int_val: expected type integer, but value is \"abc\"")
|
|
}
|
|
|
|
func TestValidateInstanceRequired(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-some-fields-required.json")
|
|
require.NoError(t, err)
|
|
|
|
validInstance := map[string]any{
|
|
"int_val": 1,
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
}
|
|
err = schema.validateRequired(validInstance)
|
|
assert.NoError(t, err)
|
|
err = schema.ValidateInstance(validInstance)
|
|
assert.NoError(t, err)
|
|
|
|
invalidInstance := map[string]any{
|
|
"string_val": "abc",
|
|
"float_val": 1.0,
|
|
"bool_val": false,
|
|
}
|
|
err = schema.validateRequired(invalidInstance)
|
|
assert.EqualError(t, err, "no value provided for required property int_val")
|
|
err = schema.ValidateInstance(invalidInstance)
|
|
assert.EqualError(t, err, "no value provided for required property int_val")
|
|
}
|
|
|
|
func TestLoadInstance(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema.json")
|
|
require.NoError(t, err)
|
|
|
|
// Expect the instance to be loaded successfully.
|
|
instance, err := schema.LoadInstance("./testdata/instance-load/valid-instance.json")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, map[string]any{
|
|
"bool_val": false,
|
|
"int_val": int64(1),
|
|
"string_val": "abc",
|
|
"float_val": 2.0,
|
|
}, instance)
|
|
|
|
// Expect instance validation against the schema to fail.
|
|
_, err = schema.LoadInstance("./testdata/instance-load/invalid-type-instance.json")
|
|
assert.EqualError(t, err, "incorrect type for property string_val: expected type string, but value is 123")
|
|
}
|
|
|
|
func TestValidateInstanceEnum(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-enum.json")
|
|
require.NoError(t, err)
|
|
|
|
validInstance := map[string]any{
|
|
"foo": "b",
|
|
"bar": int64(6),
|
|
}
|
|
assert.NoError(t, schema.validateEnum(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
invalidStringInstance := map[string]any{
|
|
"foo": "d",
|
|
"bar": int64(2),
|
|
}
|
|
assert.EqualError(t, schema.validateEnum(invalidStringInstance), "expected value of property foo to be one of [a b c]. Found: d")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidStringInstance), "expected value of property foo to be one of [a b c]. Found: d")
|
|
|
|
invalidIntInstance := map[string]any{
|
|
"foo": "a",
|
|
"bar": int64(1),
|
|
}
|
|
assert.EqualError(t, schema.validateEnum(invalidIntInstance), "expected value of property bar to be one of [2 4 6]. Found: 1")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidIntInstance), "expected value of property bar to be one of [2 4 6]. Found: 1")
|
|
}
|
|
|
|
func TestValidateInstancePattern(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-pattern.json")
|
|
require.NoError(t, err)
|
|
|
|
validInstance := map[string]any{
|
|
"foo": "axyzc",
|
|
}
|
|
assert.NoError(t, schema.validatePattern(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
invalidInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
}
|
|
assert.EqualError(t, schema.validatePattern(invalidInstanceValue), "invalid value for foo: \"xyz\". Expected to match regex pattern: a.*c")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "invalid value for foo: \"xyz\". Expected to match regex pattern: a.*c")
|
|
|
|
invalidInstanceType := map[string]any{
|
|
"foo": 1,
|
|
}
|
|
assert.EqualError(t, schema.validatePattern(invalidInstanceType), "invalid value for foo: 1. Expected a value of type string")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceType), "incorrect type for property foo: expected type string, but value is 1")
|
|
}
|
|
|
|
func TestValidateInstancePatternWithCustomMessage(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-pattern-with-custom-message.json")
|
|
require.NoError(t, err)
|
|
|
|
validInstance := map[string]any{
|
|
"foo": "axyzc",
|
|
}
|
|
assert.NoError(t, schema.validatePattern(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
invalidInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
}
|
|
assert.EqualError(t, schema.validatePattern(invalidInstanceValue), "invalid value for foo: \"xyz\". Please enter a string starting with 'a' and ending with 'c'")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "invalid value for foo: \"xyz\". Please enter a string starting with 'a' and ending with 'c'")
|
|
}
|
|
|
|
func TestValidateInstanceForMultiplePatterns(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/multiple-patterns-schema.json")
|
|
require.NoError(t, err)
|
|
|
|
// Valid values for both foo and bar
|
|
validInstance := map[string]any{
|
|
"foo": "abcc",
|
|
"bar": "deff",
|
|
}
|
|
assert.NoError(t, schema.validatePattern(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
// Valid value for bar, invalid value for foo
|
|
invalidInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
"bar": "deff",
|
|
}
|
|
assert.EqualError(t, schema.validatePattern(invalidInstanceValue), "invalid value for foo: \"xyz\". Expected to match regex pattern: ^[a-c]+$")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "invalid value for foo: \"xyz\". Expected to match regex pattern: ^[a-c]+$")
|
|
|
|
// Valid value for foo, invalid value for bar
|
|
invalidInstanceValue = map[string]any{
|
|
"foo": "abcc",
|
|
"bar": "xyz",
|
|
}
|
|
assert.EqualError(t, schema.validatePattern(invalidInstanceValue), "invalid value for bar: \"xyz\". Expected to match regex pattern: ^[d-f]+$")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "invalid value for bar: \"xyz\". Expected to match regex pattern: ^[d-f]+$")
|
|
}
|
|
|
|
func TestValidateInstanceForConst(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-const.json")
|
|
require.NoError(t, err)
|
|
|
|
// Valid values for both foo and bar
|
|
validInstance := map[string]any{
|
|
"foo": "abc",
|
|
"bar": "def",
|
|
}
|
|
assert.NoError(t, schema.validateConst(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
// Empty instance
|
|
emptyInstanceValue := map[string]any{}
|
|
assert.NoError(t, schema.validateConst(emptyInstanceValue))
|
|
assert.NoError(t, schema.ValidateInstance(emptyInstanceValue))
|
|
|
|
// Missing value for bar
|
|
missingInstanceValue := map[string]any{
|
|
"foo": "abc",
|
|
}
|
|
assert.NoError(t, schema.validateConst(missingInstanceValue))
|
|
assert.NoError(t, schema.ValidateInstance(missingInstanceValue))
|
|
|
|
// Valid value for bar, invalid value for foo
|
|
invalidInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
"bar": "def",
|
|
}
|
|
assert.EqualError(t, schema.validateConst(invalidInstanceValue), "expected value of property foo to be abc. Found: xyz")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "expected value of property foo to be abc. Found: xyz")
|
|
|
|
// Valid value for foo, invalid value for bar
|
|
invalidInstanceValue = map[string]any{
|
|
"foo": "abc",
|
|
"bar": "xyz",
|
|
}
|
|
assert.EqualError(t, schema.validateConst(invalidInstanceValue), "expected value of property bar to be def. Found: xyz")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "expected value of property bar to be def. Found: xyz")
|
|
}
|
|
|
|
func TestValidateInstanceForAnyOf(t *testing.T) {
|
|
schema, err := Load("./testdata/instance-validate/test-schema-anyof.json")
|
|
require.NoError(t, err)
|
|
|
|
// Valid values for both foo and bar
|
|
validInstance := map[string]any{
|
|
"foo": "abc",
|
|
"bar": "abc",
|
|
}
|
|
assert.NoError(t, schema.validateAnyOf(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
// Valid values for bar
|
|
validInstance = map[string]any{
|
|
"foo": "abc",
|
|
"bar": "def",
|
|
}
|
|
assert.NoError(t, schema.validateAnyOf(validInstance))
|
|
assert.NoError(t, schema.ValidateInstance(validInstance))
|
|
|
|
// Empty instance
|
|
emptyInstanceValue := map[string]any{}
|
|
assert.NoError(t, schema.validateAnyOf(emptyInstanceValue))
|
|
assert.NoError(t, schema.ValidateInstance(emptyInstanceValue))
|
|
|
|
// Missing values for bar, invalid value for foo
|
|
missingInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
}
|
|
assert.NoError(t, schema.validateAnyOf(missingInstanceValue))
|
|
assert.NoError(t, schema.ValidateInstance(missingInstanceValue))
|
|
|
|
// Valid value for bar, invalid value for foo
|
|
invalidInstanceValue := map[string]any{
|
|
"foo": "xyz",
|
|
"bar": "abc",
|
|
}
|
|
assert.EqualError(t, schema.validateAnyOf(invalidInstanceValue), "instance does not match any of the schemas in anyOf")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "instance does not match any of the schemas in anyOf")
|
|
|
|
// Invalid value for both
|
|
invalidInstanceValue = map[string]any{
|
|
"bar": "xyz",
|
|
}
|
|
assert.EqualError(t, schema.validateAnyOf(invalidInstanceValue), "instance does not match any of the schemas in anyOf")
|
|
assert.EqualError(t, schema.ValidateInstance(invalidInstanceValue), "instance does not match any of the schemas in anyOf")
|
|
}
|