Skip to content

Commit

Permalink
Fix ref being validated in object schema
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredoconnell committed Oct 23, 2023
1 parent f1b4f88 commit b134304
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
18 changes: 12 additions & 6 deletions schema/object.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,10 +338,16 @@ func (o *ObjectSchema) validateStruct(data any) error {
return o.validateFieldInterdependencies(rawData)
}

func (o *ObjectSchema) convertToObjectSchema(typeOrData any) (*ObjectSchema, bool) {
schemaType, ok := typeOrData.(*ObjectSchema)
func (o *ObjectSchema) convertToObjectSchema(typeOrData any) (Object, bool) {
// Try plain object schema
objectSchemaType, ok := typeOrData.(*ObjectSchema)
if ok {
return schemaType, true
return objectSchemaType, true
}
// Next, try ref schema
refSchemaType, ok := typeOrData.(*RefSchema)
if ok {
return refSchemaType.referencedObjectCache, true
}
// Try getting the inlined ObjectSchema for objects, like TypedObjectSchema, that do that.
value := reflect.ValueOf(typeOrData)
Expand All @@ -351,15 +357,15 @@ func (o *ObjectSchema) convertToObjectSchema(typeOrData any) (*ObjectSchema, boo
fieldAsInterface := field.Interface()
objectType, ok2 := fieldAsInterface.(ObjectSchema)
if ok2 {
schemaType = &objectType
objectSchemaType = &objectType
ok = true
}
}
}
return schemaType, ok
return objectSchemaType, ok
}

func (o *ObjectSchema) validateSchemaCompatibility(schemaType *ObjectSchema) error {
func (o *ObjectSchema) validateSchemaCompatibility(schemaType Object) error {
fieldData := map[string]any{}
// Validate IDs. This is important because the IDs should match.
if schemaType.ID() != o.ID() {
Expand Down
8 changes: 8 additions & 0 deletions schema/object_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,10 +426,18 @@ func TestTypedObjectSchema_Any(t *testing.T) {
assert.Error(t, err)
}

var testStructScope = schema.NewScopeSchema(&testStructSchema.ObjectSchema)

func TestObjectSchema_ValidateCompatibility(t *testing.T) {
// Schema validation
assert.NoError(t, testStructSchema.ValidateCompatibility(testStructSchema))
assert.Error(t, testStructSchema.ValidateCompatibility(testOptionalFieldSchema)) // Not the same
// Schema validation with ref
objectTestRef := schema.NewRefSchema("testStruct", nil)
objectTestRef.ApplyScope(testStructScope)
assert.NoError(t, objectTestRef.ValidateCompatibility(testStructSchema))
assert.NoError(t, testStructSchema.ValidateCompatibility(objectTestRef))

// map verification
validData := map[string]any{
"Field1": 42,
Expand Down

0 comments on commit b134304

Please sign in to comment.