Skip to content

Commit

Permalink
Fix Enum Query Parameters (#822)
Browse files Browse the repository at this point in the history
  • Loading branch information
mgross-ebner committed Aug 8, 2023
1 parent b81a83e commit 409c01f
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 41 deletions.
4 changes: 4 additions & 0 deletions openapi3/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -1149,6 +1149,10 @@ func (schema *Schema) visitSetOperations(settings *schemaValidationSettings, val
if v == f {
return
}
case int64:
if v == float64(c) {
return
}
default:
if reflect.DeepEqual(v, value) {
return
Expand Down
149 changes: 108 additions & 41 deletions openapi3filter/validation_enum_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import (
)

func TestValidationWithIntegerEnum(t *testing.T) {
const spec = `
t.Run("PUT Request", func(t *testing.T) {
const spec = `
openapi: 3.0.0
info:
title: Example integer enum
Expand Down Expand Up @@ -41,56 +42,122 @@ paths:
description: Ok
`

loader := openapi3.NewLoader()
doc, err := loader.LoadFromData([]byte(spec))
require.NoError(t, err)
loader := openapi3.NewLoader()
doc, err := loader.LoadFromData([]byte(spec))
require.NoError(t, err)

router, err := legacyrouter.NewRouter(doc)
require.NoError(t, err)
router, err := legacyrouter.NewRouter(doc)
require.NoError(t, err)

tests := []struct {
data []byte
wantErr bool
}{
{
[]byte(`{"exenum": 1}`),
false,
},
{
[]byte(`{"exenum": "1"}`),
true,
},
{
[]byte(`{"exenum": null}`),
false,
},
{
[]byte(`{}`),
false,
},
}
tests := []struct {
data []byte
wantErr bool
}{
{
[]byte(`{"exenum": 1}`),
false,
},
{
[]byte(`{"exenum": "1"}`),
true,
},
{
[]byte(`{"exenum": null}`),
false,
},
{
[]byte(`{}`),
false,
},
}

for _, tt := range tests {
body := bytes.NewReader(tt.data)
req, err := http.NewRequest("PUT", "/sample", body)
for _, tt := range tests {
body := bytes.NewReader(tt.data)
req, err := http.NewRequest("PUT", "/sample", body)
require.NoError(t, err)
req.Header.Add(headerCT, "application/json")

route, pathParams, err := router.FindRoute(req)
require.NoError(t, err)

requestValidationInput := &RequestValidationInput{
Request: req,
PathParams: pathParams,
Route: route,
}
err = ValidateRequest(loader.Context, requestValidationInput)
if tt.wantErr {
require.Error(t, err)
} else {
require.NoError(t, err)
}
}
})

t.Run("GET Request", func(t *testing.T) {
const spec = `
openapi: 3.0.0
info:
title: Example integer enum
version: '0.1'
paths:
/sample:
get:
parameters:
- in: query
name: exenum
schema:
type: integer
enum:
- 0
- 1
- 2
- 3
responses:
'200':
description: Ok
`

loader := openapi3.NewLoader()
doc, err := loader.LoadFromData([]byte(spec))
require.NoError(t, err)
req.Header.Add(headerCT, "application/json")

route, pathParams, err := router.FindRoute(req)
router, err := legacyrouter.NewRouter(doc)
require.NoError(t, err)

requestValidationInput := &RequestValidationInput{
Request: req,
PathParams: pathParams,
Route: route,
tests := []struct {
exenum string
wantErr bool
}{
{
"1",
false,
},
{
"4",
true,
},
}
err = ValidateRequest(loader.Context, requestValidationInput)
if tt.wantErr {
require.Error(t, err)
} else {

for _, tt := range tests {
req, err := http.NewRequest("GET", "/sample?exenum="+tt.exenum, nil)
require.NoError(t, err)
route, pathParams, err := router.FindRoute(req)
require.NoError(t, err)

requestValidationInput := &RequestValidationInput{
Request: req,
PathParams: pathParams,
Route: route,
}
err = ValidateRequest(loader.Context, requestValidationInput)
if tt.wantErr {
require.Error(t, err)
} else {
require.NoError(t, err)
}
}
}
})
}

func TestValidationWithStringEnum(t *testing.T) {
Expand Down

0 comments on commit 409c01f

Please sign in to comment.