-
-
Notifications
You must be signed in to change notification settings - Fork 463
Description
Hi,
When setting default arrays in query parameters, the applied default value is a string, due to the fmt.Sprintf(%v
here:
https://github.com/getkin/kin-openapi/blob/master/openapi3filter/validate_request.go#L159
For example, if you default is []string{"A", "B", "C"}
then input.Request.URL.Query()
- contains
[]string{"[A B C]"}
(note that this is an array with ONE string) - but should contain:
[]string{"A", "B", "C"}
The following unit test reproduces the issues.
var (
StringArraySchemaWithDefault = &openapi3.SchemaRef{
Value: &openapi3.Schema{
Type: &openapi3.Types{"array"},
Items: stringSchema,
Default: []string{"A", "B", "C"},
},
}
)
func TestValidateRequestDefault(t *testing.T) {
type testCase struct {
name string
param *openapi3.Parameter
query string
wantQuery map[string][]string
}
testCases := []testCase{
{
name: "String Array In Query",
param: &openapi3.Parameter{
Name: "param", In: "query", Style: "form", Explode: explode,
Schema: StringArraySchemaWithDefault,
},
wantQuery: map[string][]string{
"param": {
"A",
"B",
"C",
},
},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
info := &openapi3.Info{
Title: "MyAPI",
Version: "0.1",
}
doc := &openapi3.T{OpenAPI: "3.0.0", Info: info, Paths: openapi3.NewPaths()}
op := &openapi3.Operation{
OperationID: "test",
Parameters: []*openapi3.ParameterRef{{Value: tc.param}},
Responses: openapi3.NewResponses(),
}
doc.AddOperation("/test", http.MethodGet, op)
err := doc.Validate(context.Background())
require.NoError(t, err)
router, err := legacyrouter.NewRouter(doc)
require.NoError(t, err)
req, err := http.NewRequest(http.MethodGet, "http://test.org/test?"+tc.query, nil)
route, pathParams, err := router.FindRoute(req)
require.NoError(t, err)
input := &RequestValidationInput{Request: req, PathParams: pathParams, Route: route}
err = ValidateParameter(context.Background(), input, tc.param)
require.NoError(t, err)
for k, v := range tc.wantQuery {
require.Equal(t, v, input.GetQueryParams()[k])
}
})
}
}
Metadata
Metadata
Assignees
Labels
No labels