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  }