github.com/soulteary/pocket-bookcase@v0.0.0-20240428065142-0b5a9a0fc98a/internal/testutil/http.go (about) 1 package testutil 2 3 import ( 4 "io" 5 "net/http" 6 "net/http/httptest" 7 "strings" 8 9 "github.com/gin-gonic/gin" 10 ) 11 12 // NewGin returns a new gin engine with test mode enabled. 13 func NewGin() *gin.Engine { 14 engine := gin.New() 15 gin.SetMode(gin.TestMode) 16 return engine 17 } 18 19 type Option = func(*http.Request) 20 21 func WithBody(body string) Option { 22 return func(request *http.Request) { 23 request.Body = io.NopCloser(strings.NewReader(body)) 24 } 25 } 26 27 func WithHeader(name, value string) Option { 28 return func(request *http.Request) { 29 request.Header.Add(name, value) 30 } 31 } 32 33 func PerformRequest(handler http.Handler, method, path string, options ...Option) *httptest.ResponseRecorder { 34 recorder := httptest.NewRecorder() 35 return PerformRequestWithRecorder(recorder, handler, method, path, options...) 36 } 37 38 func PerformRequestWithRecorder(recorder *httptest.ResponseRecorder, r http.Handler, method, path string, options ...Option) *httptest.ResponseRecorder { 39 request, err := http.NewRequest(method, path, nil) 40 if err != nil { 41 panic(err) 42 } 43 for _, opt := range options { 44 opt(request) 45 } 46 r.ServeHTTP(recorder, request) 47 return recorder 48 }