From 485d661561bf3e15ba74a5febe5f20cbb74c819c Mon Sep 17 00:00:00 2001 From: Pierre Fenoll Date: Tue, 5 Jan 2021 14:33:15 +0100 Subject: [PATCH] wip setting defaults for #206 Signed-off-by: Pierre Fenoll --- openapi3filter/validate_readonly_test.go | 34 ++++++++++++++++++++---- openapi3filter/validate_request.go | 10 ++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/openapi3filter/validate_readonly_test.go b/openapi3filter/validate_readonly_test.go index fac9bf524..7f5116b9c 100644 --- a/openapi3filter/validate_readonly_test.go +++ b/openapi3filter/validate_readonly_test.go @@ -3,6 +3,7 @@ package openapi3filter import ( "bytes" "encoding/json" + "io/ioutil" "net/http" "testing" @@ -25,6 +26,16 @@ func TestValidatingRequestBodyWithReadOnlyProperty(t *testing.T) { "/accounts": { "post": { "description": "Create a new account", + "parameters": [ + { + "in": "query", + "name": "q", + "schema": { + "type": "string", + "default": "Q" + } + } + ], "requestBody": { "required": true, "content": { @@ -33,6 +44,10 @@ func TestValidatingRequestBodyWithReadOnlyProperty(t *testing.T) { "type": "object", "required": ["_id"], "properties": { + "_": { + "type": "boolean", + "default": false + }, "_id": { "type": "string", "description": "Unique identifier for this object.", @@ -60,16 +75,17 @@ func TestValidatingRequestBodyWithReadOnlyProperty(t *testing.T) { } ` - type Request struct { - ID string `json:"_id"` - } - sl := openapi3.NewSwaggerLoader() l, err := sl.LoadSwaggerFromData([]byte(spec)) require.NoError(t, err) router := NewRouter().WithSwagger(l) - b, err := json.Marshal(Request{ID: "bt6kdc3d0cvp6u8u3ft0"}) + b, err := json.Marshal(struct { + Blank bool `json:"_,omitempty"` + ID string `json:"_id"` + }{ + ID: "bt6kdc3d0cvp6u8u3ft0", + }) require.NoError(t, err) httpReq, err := http.NewRequest(http.MethodPost, "/accounts", bytes.NewReader(b)) @@ -85,4 +101,12 @@ func TestValidatingRequestBodyWithReadOnlyProperty(t *testing.T) { Route: route, }) require.NoError(t, err) + + // Unset default values in body were set + validatedReqBody, err := ioutil.ReadAll(httpReq.Body) + require.NoError(t, err) + require.JSONEq(t, `{"_":false,"_id":"bt6kdc3d0cvp6u8u3ft0"}`, string(validatedReqBody)) + // Unset default values in URL were set + // Unset default values in headers were set + // Unset default values in cookies were set } diff --git a/openapi3filter/validate_request.go b/openapi3filter/validate_request.go index 0af54c299..a310113b8 100644 --- a/openapi3filter/validate_request.go +++ b/openapi3filter/validate_request.go @@ -54,7 +54,6 @@ func ValidateRequest(c context.Context, input *RequestValidationInput) error { if err = ValidateParameter(c, input, parameter); err != nil && !options.MultiError { return err } - if err != nil { me = append(me, err) } @@ -65,7 +64,6 @@ func ValidateRequest(c context.Context, input *RequestValidationInput) error { if err = ValidateParameter(c, input, parameter.Value); err != nil && !options.MultiError { return err } - if err != nil { me = append(me, err) } @@ -77,7 +75,6 @@ func ValidateRequest(c context.Context, input *RequestValidationInput) error { if err = ValidateRequestBody(c, input, requestBody.Value); err != nil && !options.MultiError { return err } - if err != nil { me = append(me, err) } @@ -97,7 +94,6 @@ func ValidateRequest(c context.Context, input *RequestValidationInput) error { if err = ValidateSecurityRequirements(c, input, *security); err != nil && !options.MultiError { return err } - if err != nil { me = append(me, err) } @@ -142,6 +138,12 @@ func ValidateParameter(c context.Context, input *RequestValidationInput, paramet } schema = parameter.Schema.Value } + + // Maybe use default value + if value == nil && schema != nil { + value = schema.Default + } + // Validate a parameter's value. if value == nil { if parameter.Required {