mockHttpClient.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package util
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "net/url"
  9. "strings"
  10. "gitea.ckfah.com/cjjy/gocommon/pkg/net/engines"
  11. )
  12. const (
  13. defaultHttpRequestMethod = http.MethodPost
  14. defaultHttpRequestPath = "/"
  15. )
  16. var (
  17. middleWareHandlerFunc []engines.HandlerFunc
  18. handlerRequestHeaders []func(ctx context.Context, header http.Header)
  19. )
  20. /**
  21. 添加全局的Middle ware
  22. */
  23. func AddMiddleWareHandlerFunc(fun engines.HandlerFunc) {
  24. if fun == nil {
  25. return
  26. }
  27. middleWareHandlerFunc = append(middleWareHandlerFunc, fun)
  28. }
  29. /**
  30. 添加全局的Header处理器
  31. */
  32. func AddHandlerRequestHeaders(fun func(ctx context.Context, header http.Header)) {
  33. if fun == nil {
  34. return
  35. }
  36. handlerRequestHeaders = append(handlerRequestHeaders, fun)
  37. }
  38. var (
  39. PostMethodOption Option = func(request *TestHttpRequest) {
  40. request.Method = http.MethodPost
  41. }
  42. GetMethodOption Option = func(request *TestHttpRequest) {
  43. request.Method = http.MethodGet
  44. }
  45. RequestHeaderOption = func(handler func(ctx context.Context, header http.Header)) Option {
  46. return func(request *TestHttpRequest) {
  47. request.handlerRequestHeaders = append(request.handlerRequestHeaders, handler)
  48. }
  49. }
  50. AddFormParamOption = func(key string, value string) Option {
  51. return func(request *TestHttpRequest) {
  52. request.params.Set(key, value)
  53. }
  54. }
  55. JsonBodyOption = func(jsonBody string) Option {
  56. return func(request *TestHttpRequest) {
  57. request.RequestBody = strings.NewReader(jsonBody)
  58. }
  59. }
  60. MultipartFormDataOption = func(params map[string]string, fileTypeParams []FileForm) (Option, error) {
  61. reader, headerValue, err := NewMultiFormRequest(params, fileTypeParams)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return func(request *TestHttpRequest) {
  66. option := RequestHeaderOption(func(ctx context.Context, header http.Header) {
  67. header.Set("Content-Type", headerValue)
  68. })
  69. option(request)
  70. request.RequestBody = reader
  71. }, nil
  72. }
  73. HandlerFuncOption = func(handler engines.HandlerFunc) Option {
  74. return func(request *TestHttpRequest) {
  75. request.handlerFunctions = append(request.handlerFunctions, handler)
  76. }
  77. }
  78. WithContextOption = func(ctx context.Context) Option {
  79. return func(request *TestHttpRequest) {
  80. request.Ctx = ctx
  81. }
  82. }
  83. )
  84. type Option func(request *TestHttpRequest)
  85. type TestHttpRequest struct {
  86. Ctx context.Context
  87. Method string
  88. Path string
  89. RequestBody io.Reader
  90. handlerRequestHeaders []func(ctx context.Context, header http.Header)
  91. header http.Header
  92. handlerFunctions []engines.HandlerFunc
  93. params url.Values
  94. }
  95. /**
  96. Post &&\
  97. Json
  98. */
  99. func NewTestHttpRequestWithDefault(jsonBody string, handler ...engines.HandlerFunc) (*http.Response, error) {
  100. return NewTestPostHttpRequest(jsonBody, handler...)
  101. }
  102. func NewTestPostHttpRequest(jsonBody string, handler ...engines.HandlerFunc) (*http.Response, error) {
  103. params := make([]Option, 0, len(handler)+1)
  104. params = append(params, JsonBodyOption(jsonBody))
  105. for _, elem := range handler {
  106. params = append(params, HandlerFuncOption(elem))
  107. }
  108. return NewTestHttpRequest(params...).MockHttpRequest()
  109. }
  110. /**
  111. Post &&\
  112. multipart/form-data
  113. */
  114. func NewTestHttpRequestWithUploadFile(requestParams map[string]string, fileTypeParams []FileForm, handler ...engines.HandlerFunc) (*http.Response, error) {
  115. params := make([]Option, 0, len(handler)+1)
  116. option, err := MultipartFormDataOption(requestParams, fileTypeParams)
  117. if err != nil {
  118. return nil, err
  119. }
  120. params = append(params, option)
  121. for _, elem := range handler {
  122. params = append(params, HandlerFuncOption(elem))
  123. }
  124. return NewTestHttpRequest(params...).MockHttpRequest()
  125. }
  126. /**
  127. GET
  128. */
  129. func NewTestHttpRequestWithDownLoadFile(requestParams map[string]string, handler ...engines.HandlerFunc) (*http.Response, error) {
  130. return NewTestGetHttpRequest(requestParams, handler...)
  131. }
  132. func NewTestGetHttpRequest(requestParams map[string]string, handler ...engines.HandlerFunc) (*http.Response, error) {
  133. params := make([]Option, 0, len(handler)+1+len(requestParams))
  134. for key, value := range requestParams {
  135. params = append(params, AddFormParamOption(key, value))
  136. }
  137. params = append(params, GetMethodOption)
  138. for _, elem := range handler {
  139. params = append(params, HandlerFuncOption(elem))
  140. }
  141. return NewTestHttpRequest(params...).MockHttpRequest()
  142. }
  143. func NewTestHttpRequest(ops ...Option) *TestHttpRequest {
  144. request := new(TestHttpRequest)
  145. request.Path = defaultHttpRequestPath
  146. request.Method = defaultHttpRequestMethod
  147. request.Ctx = context.Background()
  148. request.params = map[string][]string{}
  149. request.handlerFunctions = append([]engines.HandlerFunc{}, middleWareHandlerFunc...)
  150. request.handlerRequestHeaders = append([]func(ctx context.Context, header http.Header){}, handlerRequestHeaders...)
  151. for _, elem := range ops {
  152. elem(request)
  153. }
  154. return request
  155. }
  156. func (request *TestHttpRequest) MockHttpRequest() (*http.Response, error) {
  157. mux := http.NewServeMux()
  158. engine := engines.New()
  159. engine.Handle(request.Method, request.Path, request.handlerFunctions...)
  160. mux.Handle(request.Path, engine)
  161. r, err := http.NewRequestWithContext(request.Ctx, request.Method, request.Path, request.RequestBody)
  162. if err != nil {
  163. return nil, err
  164. }
  165. for _, elem := range request.handlerRequestHeaders {
  166. elem(request.Ctx, r.Header)
  167. }
  168. r.URL.RawQuery = request.params.Encode()
  169. w := httptest.NewRecorder()
  170. mux.ServeHTTP(w, r)
  171. return w.Result(), nil
  172. }
  173. func newRequestBody() io.ReadWriter {
  174. return &bytes.Buffer{}
  175. }