Skip to content

Commit

Permalink
test: Add schema oneOf tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rtfpessoa committed Aug 4, 2021
1 parent 0b6e029 commit e1b14e9
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 4 deletions.
10 changes: 6 additions & 4 deletions openapi3/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"math/big"
"regexp"
"strconv"
"strings"
"unicode/utf16"

"github.com/getkin/kin-openapi/jsoninfo"
Expand Down Expand Up @@ -877,11 +876,14 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val

if ok != 1 {
if len(validationErrors) > 1 {
errorMessages := make([]string, len(validationErrors))
errorMessage := ""
for _, err := range validationErrors {
errorMessages = append(errorMessages, err.Error())
if errorMessage != "" {
errorMessage += " Or "
}
errorMessage += err.Error()
}
return errors.New("doesn't match schema due to: " + strings.Join(errorMessages, " and "))
return errors.New("doesn't match schema due to: " + errorMessage)
}
if settings.failfast {
return errSchema
Expand Down
118 changes: 118 additions & 0 deletions openapi3/schema_oneOf_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package openapi3

import (
"testing"

"github.com/stretchr/testify/require"
)

var oneofSpec = []byte(`components:
schemas:
Cat:
type: object
properties:
name:
type: string
scratches:
type: boolean
$type:
type: string
enum:
- cat
required:
- name
- scratches
- $type
Dog:
type: object
properties:
name:
type: string
barks:
type: boolean
$type:
type: string
enum:
- dog
required:
- name
- barks
- $type
Animal:
type: object
oneOf:
- $ref: "#/components/schemas/Cat"
- $ref: "#/components/schemas/Dog"
discriminator:
propertyName: $type
mapping:
cat: "#/components/schemas/Cat"
dog: "#/components/schemas/Dog"
`)

var oneofNoDiscriminatorSpec = []byte(`components:
schemas:
Cat:
type: object
properties:
name:
type: string
scratches:
type: boolean
required:
- name
- scratches
Dog:
type: object
properties:
name:
type: string
barks:
type: boolean
required:
- name
- barks
Animal:
type: object
oneOf:
- $ref: "#/components/schemas/Cat"
- $ref: "#/components/schemas/Dog"
`)

func TestVisitJSON_OneOf_MissingDiscriptorProperty(t *testing.T) {
s, err := NewLoader().LoadFromData(oneofSpec)
require.NoError(t, err)
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
"name": "snoopy",
})
require.EqualError(t, err, "input does not contain the discriminator property")
}

func TestVisitJSON_OneOf_MissingDiscriptorValue(t *testing.T) {
s, err := NewLoader().LoadFromData(oneofSpec)
require.NoError(t, err)
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
"name": "snoopy",
"$type": "snake",
})
require.EqualError(t, err, "input does not a valid discriminator value")
}

func TestVisitJSON_OneOf_MissingField(t *testing.T) {
s, err := NewLoader().LoadFromData(oneofSpec)
require.NoError(t, err)
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
"name": "snoopy",
"$type": "dog",
})
require.EqualError(t, err, "Error at \"/barks\": property \"barks\" is missing\nSchema:\n {\n \"properties\": {\n \"$type\": {\n \"enum\": [\n \"dog\"\n ],\n \"type\": \"string\"\n },\n \"barks\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"barks\",\n \"$type\"\n ],\n \"type\": \"object\"\n }\n\nValue:\n {\n \"$type\": \"dog\",\n \"name\": \"snoopy\"\n }\n")
}

func TestVisitJSON_OneOf_NoDiscriptor_MissingField(t *testing.T) {
s, err := NewLoader().LoadFromData(oneofNoDiscriminatorSpec)
require.NoError(t, err)
err = s.Components.Schemas["Animal"].Value.VisitJSON(map[string]interface{}{
"name": "snoopy",
})
require.EqualError(t, err, "doesn't match schema due to: Error at \"/scratches\": property \"scratches\" is missing\nSchema:\n {\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"scratches\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"name\",\n \"scratches\"\n ],\n \"type\": \"object\"\n }\n\nValue:\n {\n \"name\": \"snoopy\"\n }\n Or Error at \"/barks\": property \"barks\" is missing\nSchema:\n {\n \"properties\": {\n \"barks\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"barks\"\n ],\n \"type\": \"object\"\n }\n\nValue:\n {\n \"name\": \"snoopy\"\n }\n")
}

0 comments on commit e1b14e9

Please sign in to comment.