From 46e0df8ae84cbb51b7c672a0bb8ebb6995d28c7a Mon Sep 17 00:00:00 2001 From: orensolo <46680749+orensolo@users.noreply.github.com> Date: Tue, 20 Dec 2022 11:29:35 +0200 Subject: [PATCH] openapi3filter: use option to skip setting defaults on validation (#708) --- openapi3filter/issue707_test.go | 91 ++++++++++++++++++++++++++++++ openapi3filter/validate_request.go | 2 +- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 openapi3filter/issue707_test.go diff --git a/openapi3filter/issue707_test.go b/openapi3filter/issue707_test.go new file mode 100644 index 000000000..c0dbe6462 --- /dev/null +++ b/openapi3filter/issue707_test.go @@ -0,0 +1,91 @@ +package openapi3filter + +import ( + "net/http" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/getkin/kin-openapi/openapi3" + "github.com/getkin/kin-openapi/routers/gorillamux" +) + +func TestIssue707(t *testing.T) { + loader := openapi3.NewLoader() + ctx := loader.Context + spec := ` + openapi: 3.0.0 + info: + version: 1.0.0 + title: Sample API + paths: + /items: + get: + description: Returns a list of stuff + parameters: + - description: parameter with a default value + explode: true + in: query + name: param-with-default + schema: + default: 124 + type: integer + style: form + required: false + responses: + '200': + description: Successful response +`[1:] + + doc, err := loader.LoadFromData([]byte(spec)) + require.NoError(t, err) + + err = doc.Validate(ctx) + require.NoError(t, err) + + router, err := gorillamux.NewRouter(doc) + require.NoError(t, err) + + tests := []struct { + name string + options *Options + expectedQuery string + }{ + { + name: "no defaults are added to requests parameters", + options: &Options{ + SkipSettingDefaults: true, + }, + expectedQuery: "", + }, + + { + name: "defaults are added to requests", + expectedQuery: "param-with-default=124", + }, + } + + for _, testcase := range tests { + t.Run(testcase.name, func(t *testing.T) { + httpReq, err := http.NewRequest(http.MethodGet, "/items", strings.NewReader("")) + require.NoError(t, err) + + route, pathParams, err := router.FindRoute(httpReq) + require.NoError(t, err) + + requestValidationInput := &RequestValidationInput{ + Request: httpReq, + PathParams: pathParams, + Route: route, + Options: testcase.options, + } + err = ValidateRequest(ctx, requestValidationInput) + require.NoError(t, err) + + require.NoError(t, err) + require.Equal(t, testcase.expectedQuery, + httpReq.URL.RawQuery, "default value must not be included") + }) + } +} diff --git a/openapi3filter/validate_request.go b/openapi3filter/validate_request.go index 2424eb9ed..a61c57a09 100644 --- a/openapi3filter/validate_request.go +++ b/openapi3filter/validate_request.go @@ -137,7 +137,7 @@ func ValidateParameter(ctx context.Context, input *RequestValidationInput, param } // Set default value if needed - if value == nil && schema != nil && schema.Default != nil { + if !options.SkipSettingDefaults && value == nil && schema != nil && schema.Default != nil { value = schema.Default req := input.Request switch parameter.In {