diff --git a/hrp/step_api.go b/hrp/step_api.go index cce14cd0..a2c0bad0 100644 --- a/hrp/step_api.go +++ b/hrp/step_api.go @@ -117,6 +117,10 @@ func extendWithAPI(testStep *TStep, overriddenStep *API) { } // merge & override request testStep.Request = overriddenStep.Request + // init upload + if testStep.Request.Upload != nil { + initUpload(testStep) + } // merge & override variables testStep.Variables = mergeVariables(testStep.Variables, overriddenStep.Variables) // merge & override extractors diff --git a/hrp/step_request.go b/hrp/step_request.go index 29a86578..a854af19 100644 --- a/hrp/step_request.go +++ b/hrp/step_request.go @@ -259,24 +259,31 @@ func (r *requestBuilder) prepareBody(stepVariables map[string]interface{}) error return nil } -func prepareUpload(parser *Parser, step *TStep) (err error) { - if step.Request.Upload == nil { - return - } - step.Request.Upload, err = parser.ParseVariables(step.Request.Upload) - if err != nil { - return - } - if step.Variables == nil { - step.Variables = make(map[string]interface{}) - } - step.Variables["m_upload"] = step.Request.Upload - step.Variables["m_encoder"] = fmt.Sprintf("${multipart_encoder($m_upload)}") +func initUpload(step *TStep) { if step.Request.Headers == nil { step.Request.Headers = make(map[string]string) } step.Request.Headers["Content-Type"] = "${multipart_content_type($m_encoder)}" step.Request.Body = "$m_encoder" +} + +func prepareUpload(parser *Parser, step *TStep, stepVariables map[string]interface{}) (err error) { + if step.Request.Upload == nil { + return + } + uploadSlice := map[string]interface{}{} + for key, value := range step.Request.Upload { + uploadSlice[key], err = parser.Parse(value, stepVariables) + if err != nil { + return + } + } + stepVariables["m_upload"] = uploadSlice + mEncoder, err := parser.Parse("${multipart_encoder($m_upload)}", stepVariables) + if err != nil { + return + } + stepVariables["m_encoder"] = mEncoder return } @@ -295,13 +302,13 @@ func runStepRequest(r *SessionRunner, step *TStep) (stepResult *StepResult, err } }() - err = prepareUpload(r.parser, step) + // override step variables + stepVariables, err := r.MergeStepVariables(step.Variables) if err != nil { return } - // override step variables - stepVariables, err := r.MergeStepVariables(step.Variables) + err = prepareUpload(r.parser, step, stepVariables) if err != nil { return } @@ -822,6 +829,8 @@ func (s *StepRequestWithOptionalArgs) WithBody(body interface{}) *StepRequestWit // WithUpload sets HTTP request body for uploading file(s). func (s *StepRequestWithOptionalArgs) WithUpload(upload map[string]interface{}) *StepRequestWithOptionalArgs { + // init upload + initUpload(s.step) s.step.Request.Upload = upload return s } diff --git a/hrp/testcase.go b/hrp/testcase.go index 6a91939b..69120497 100644 --- a/hrp/testcase.go +++ b/hrp/testcase.go @@ -144,6 +144,10 @@ func (path *TestCasePath) ToTestCase() (*TestCase, error) { step: step, }) } else if step.Request != nil { + // init upload + if step.Request.Upload != nil { + initUpload(step) + } testCase.TestSteps = append(testCase.TestSteps, &StepRequestWithOptionalArgs{ step: step, }) diff --git a/hrp/tests/upload_test.go b/hrp/tests/upload_test.go index d9273d17..2897eabe 100644 --- a/hrp/tests/upload_test.go +++ b/hrp/tests/upload_test.go @@ -9,12 +9,13 @@ import ( func TestCaseUploadFile(t *testing.T) { testcase := &hrp.TestCase{ Config: hrp.NewConfig("test upload file to httpbin"). - SetBaseURL("https://httpbin.org"), + SetBaseURL("https://httpbin.org"). + WithVariables(map[string]interface{}{"upload_file": "test.env"}), TestSteps: []hrp.IStep{ hrp.NewStep("upload file"). WithVariables(map[string]interface{}{ "m_encoder": "${multipart_encoder($m_upload)}", - "m_upload": map[string]interface{}{"file": "test.env"}, + "m_upload": map[string]interface{}{"file": "$upload_file"}, }). POST("/post"). WithHeaders(map[string]string{"Content-Type": "${multipart_content_type($m_encoder)}"}). @@ -24,7 +25,7 @@ func TestCaseUploadFile(t *testing.T) { AssertStartsWith("body.files.file", "UserName=test", "check uploaded file"), hrp.NewStep("upload file with keyword"). POST("/post"). - WithUpload(map[string]interface{}{"file": "test.env"}). + WithUpload(map[string]interface{}{"file": "$upload_file"}). Validate(). AssertEqual("status_code", 200, "check status code"). AssertStartsWith("body.files.file", "UserName=test", "check uploaded file"),