github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/httplib/testify/request.go (about) 1 package testify 2 3 import ( 4 "bytes" 5 "fmt" 6 "strings" 7 8 "github.com/gin-gonic/gin" 9 "github.com/sirupsen/logrus" 10 11 "github.com/artisanhe/tools/courier/transport_http/transform" 12 ) 13 14 func NewContext(method string, url string, req interface{}) (ctx *gin.Context) { 15 ctx = &gin.Context{} 16 if req == nil { 17 request, err := transform.NewHttpRequestFromParameterGroup(method, url, nil) 18 if err != nil { 19 panic(err) 20 } 21 ctx.Request = request 22 } 23 24 group := transform.ParameterGroupFromValue(req) 25 request, err := transform.NewHttpRequestFromParameterGroup(method, url, group) 26 if err != nil { 27 panic(err) 28 } 29 ctx.Request = request 30 31 for _, p := range group.Context { 32 ctx.Set(p.Name, p.Value.Interface()) 33 } 34 35 params, err := ParseParams(url, request.URL.Path) 36 if err != nil { 37 panic(err) 38 } 39 40 logrus.Infof("Gin Test Context %s %s", method, request.URL.String()) 41 42 ctx.Params = params 43 44 rwiter := &TestResponseWriter{} 45 rwiter.Body = &bytes.Buffer{} 46 ctx.Writer = rwiter 47 48 return 49 50 } 51 52 func ParseParams(path string, url string) (params gin.Params, err error) { 53 pathArr := strings.Split(path, "/") 54 urlArr := strings.Split(url, "/") 55 56 if len(pathArr) != len(urlArr) { 57 return nil, fmt.Errorf("url %s is not match path %s", url, path) 58 } 59 60 for i, p := range pathArr { 61 if strings.HasPrefix(p, ":") { 62 params = append(params, gin.Param{ 63 Key: p[1:], 64 Value: urlArr[i], 65 }) 66 } 67 } 68 69 return params, nil 70 }