feat: hrp support uploading file

This commit is contained in:
buyuxiang
2022-06-21 16:18:38 +08:00
parent 3006b0b0bb
commit da41def86b
8 changed files with 139 additions and 66 deletions

View File

@@ -1,13 +1,8 @@
package convert
import (
"bytes"
"fmt"
"io"
"mime/multipart"
"net/url"
"os"
"path/filepath"
"reflect"
"strings"
@@ -158,7 +153,7 @@ func (c *ConverterPostman) ToYAML() (string, error) {
}
func (c *ConverterPostman) ToGoTest() (string, error) {
//TODO implement me
// TODO implement me
return "", errors.New("convert from postman to gotest scripts is not supported yet")
}
@@ -208,7 +203,7 @@ func (c *ConverterPostman) prepareTestSteps(casePostman *CasePostman) ([]*hrp.TS
var steps []*hrp.TStep
for _, item := range itemList {
step, err := c.prepareTestStep(&item, steps)
step, err := c.prepareTestStep(&item)
if err != nil {
return nil, err
}
@@ -234,7 +229,7 @@ func extractItemList(item TItem, itemList *[]TItem) {
}
}
func (c *ConverterPostman) prepareTestStep(item *TItem, steps []*hrp.TStep) (*hrp.TStep, error) {
func (c *ConverterPostman) prepareTestStep(item *TItem) (*hrp.TStep, error) {
log.Info().
Str("method", item.Request.Method).
Str("url", item.Request.URL.Raw).
@@ -265,7 +260,7 @@ func (c *ConverterPostman) prepareTestStep(item *TItem, steps []*hrp.TStep) (*hr
if err := step.makeRequestCookies(item); err != nil {
return nil, err
}
if err := step.makeRequestBody(item, steps); err != nil {
if err := step.makeRequestBody(item); err != nil {
return nil, err
}
return &step.TStep, nil
@@ -373,7 +368,7 @@ func (s *stepFromPostman) parseRequestCookiesMap(cookies string) {
}
}
func (s *stepFromPostman) makeRequestBody(item *TItem, steps []*hrp.TStep) error {
func (s *stepFromPostman) makeRequestBody(item *TItem) error {
mode := item.Request.Body.Mode
if mode == "" {
return nil
@@ -382,7 +377,7 @@ func (s *stepFromPostman) makeRequestBody(item *TItem, steps []*hrp.TStep) error
case enumBodyRaw:
return s.makeRequestBodyRaw(item)
case enumBodyFormData:
return s.makeRequestBodyFormData(item, steps)
return s.makeRequestBodyFormData(item)
case enumBodyUrlEncoded:
return s.makeRequestBodyUrlEncoded(item)
case enumBodyFile, enumBodyGraphQL:
@@ -424,49 +419,22 @@ func (s *stepFromPostman) makeRequestBodyRaw(item *TItem) (err error) {
return
}
func (s *stepFromPostman) makeRequestBodyFormData(item *TItem, steps []*hrp.TStep) (err error) {
defer func() {
if err != nil {
err = errors.Wrap(err, "make request body form-data failed")
}
}()
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload)
func (s *stepFromPostman) makeRequestBodyFormData(item *TItem) error {
s.Request.Upload = make(map[string]interface{})
for _, field := range item.Request.Body.FormData {
if field.Disabled {
continue
}
// form data could be text or file
if field.Type == enumFieldTypeText {
err = writer.WriteField(field.Key, field.Value)
if err != nil {
return
}
s.Request.Upload[field.Key] = field.Value
} else if field.Type == enumFieldTypeFile {
err = writeFormDataFile(writer, &field)
if err != nil {
return
}
s.Request.Upload[field.Key] = field.Src
} else {
return errors.Errorf("make request body form data failed: unexpect field type: %v", field.Type)
}
}
err = writer.Close()
s.Request.Body = payload.String()
s.Request.Headers["Content-Type"] = writer.FormDataContentType()
return
}
func writeFormDataFile(writer *multipart.Writer, field *TField) error {
file, err := os.Open(field.Src)
if err != nil {
return err
}
defer file.Close()
formFile, err := writer.CreateFormFile(field.Key, filepath.Base(field.Src))
if err != nil {
return err
}
_, err = io.Copy(formFile, file)
return err
return nil
}
func (s *stepFromPostman) makeRequestBodyUrlEncoded(item *TItem) error {
@@ -482,7 +450,7 @@ func (s *stepFromPostman) makeRequestBodyUrlEncoded(item *TItem) error {
return nil
}
// TODO makeValidate from example response
// TODO makeValidate from test scripts
func (s *stepFromPostman) makeValidate(item *TItem) error {
return nil
}

View File

@@ -71,11 +71,8 @@ func TestMakeTestCaseFromCollection(t *testing.T) {
if !assert.Equal(t, "v1", tCase.TestSteps[0].Request.Params["k1"]) {
t.Fatal()
}
// check cookies (pass, postman collection doesn't contains cookies)
// check cookies (pass, postman collection doesn't contain cookies)
// check headers
if !assert.Contains(t, tCase.TestSteps[1].Request.Headers["Content-Type"], "multipart/form-data") {
t.Fatal()
}
if !assert.Equal(t, "application/x-www-form-urlencoded", tCase.TestSteps[2].Request.Headers["Content-Type"]) {
t.Fatal()
}
@@ -92,9 +89,6 @@ func TestMakeTestCaseFromCollection(t *testing.T) {
if !assert.Equal(t, nil, tCase.TestSteps[0].Request.Body) {
t.Fatal()
}
if !assert.NotEmpty(t, tCase.TestSteps[1].Request.Body) {
t.Fatal()
}
if !assert.Equal(t, map[string]string{"k1": "v1", "k2": "v2"}, tCase.TestSteps[2].Request.Body) {
t.Fatal()
}
@@ -121,9 +115,6 @@ func TestMakeTestCaseWithProfileOverride(t *testing.T) {
if step.Request.Method == "GET" && !assert.Len(t, step.Request.Headers, 1) {
t.Fatal()
}
if step.Request.Method == "POST" && !assert.Len(t, step.Request.Headers, 2) {
t.Fatal()
}
if !assert.Equal(t, "all original headers will be overridden", step.Request.Headers["Header1"]) {
t.Fatal()
}