Documentation ¶
Overview ¶
Package httptest implement testing HTTP package.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type SimulateRequest ¶
type SimulateRequest struct { Method string Path string // JSONIndentResponse if not empty, the response body will be // indented using [json.Indent]. JSONIndentResponse string Header http.Header Body []byte }
SimulateRequest request to simulate http.ServeHTTP.
type SimulateResult ¶
type SimulateResult struct { Request *http.Request `json:"-"` Response *http.Response `json:"-"` RequestDump []byte ResponseDump []byte ResponseBody []byte }
SimulateResult contains http.Request and http.Response from calling http.ServeHTTP.
func Simulate ¶
func Simulate(serve http.HandlerFunc, req *SimulateRequest) (result *SimulateResult, err error)
Simulate HTTP server handler by generating http.Request from fields in SimulateRequest; and then call http.HandlerFunc. The HTTP response from serve along with its raw body and original HTTP request then returned in *SimulateResult.
Example ¶
package main import ( "encoding/json" "fmt" "log" "net/http" "git.sr.ht/~shulhan/pakakeh.go/lib/test/httptest" ) func main() { http.HandleFunc(`/a/b/c`, func(w http.ResponseWriter, req *http.Request) { _ = req.ParseForm() var ( rawjson []byte err error ) rawjson, err = json.Marshal(req.PostForm) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } w.Header().Set(`Content-Type`, `application/json`) _, _ = w.Write(rawjson) }) var simreq = &httptest.SimulateRequest{ Method: http.MethodPost, Path: `/a/b/c`, Header: http.Header{ `Content-Type`: []string{`application/x-www-form-urlencoded`}, }, Body: []byte(`id=1&name=go`), JSONIndentResponse: ` `, } var ( result *httptest.SimulateResult err error ) result, err = httptest.Simulate(http.DefaultServeMux.ServeHTTP, simreq) if err != nil { log.Fatal(err) } var dump []byte dump, err = result.DumpRequest(nil) if err != nil { log.Fatal(err) } fmt.Printf("<<< RequestDump:\n%s\n\n", dump) dump, err = result.DumpResponse(nil) if err != nil { log.Fatal(err) } fmt.Printf("<<< ResponseDump:\n%s\n\n", dump) fmt.Printf("<<< ResponseBody:\n%s\n", result.ResponseBody) }
Output: <<< RequestDump: POST /a/b/c HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded id=1&name=go <<< ResponseDump: HTTP/1.1 200 OK Connection: close Content-Type: application/json { "id": [ "1" ], "name": [ "go" ] } <<< ResponseBody: { "id": [ "1" ], "name": [ "go" ] }
func (*SimulateResult) DumpRequest ¶
func (result *SimulateResult) DumpRequest(excludeHeaders []string) (raw []byte, err error)
DumpRequest convert [SimulateResult.Request] with its body to stream of bytes using httputil.DumpRequest.
The returned bytes have CRLF ("\r\n") replaced with single LF ("\n").
Any request headers that match with excludeHeaders will be deleted before dumping.
Example ¶
package main import ( "fmt" "log" "net/http" libhttptest "git.sr.ht/~shulhan/pakakeh.go/lib/test/httptest" ) func main() { var ( req *http.Request err error ) req, err = http.NewRequest(http.MethodGet, `/a/b/c`, nil) if err != nil { log.Fatal(err) } req.Header.Set(`h1`, `v1`) req.Header.Set(`h2`, `v2`) req.Header.Set(`h3`, `v3`) var sim = libhttptest.SimulateResult{ Request: req, } var got []byte got, err = sim.DumpRequest([]string{`h1`}) if err != nil { log.Fatal(err) } fmt.Printf("DumpRequest:\n%s", got) sim.RequestDump = nil got, err = sim.DumpRequest([]string{`h3`}) if err != nil { log.Fatal(err) } fmt.Printf("DumpRequest:\n%s", got) }
Output: DumpRequest: GET /a/b/c HTTP/1.1 H2: v2 H3: v3 DumpRequest: GET /a/b/c HTTP/1.1 H1: v1 H2: v2
func (*SimulateResult) DumpResponse ¶
func (result *SimulateResult) DumpResponse(excludeHeaders []string) (raw []byte, err error)
DumpResponse convert [SimulateResult.Response] with its body to stream of bytes using httputil.DumpResponse.
The returned bytes have CRLF ("\r\n") replaced with single LF ("\n").
Any response headers that match with excludeHeaders will be deleted before dumping.
Example ¶
package main import ( "context" "fmt" "io" "log" "net/http" "net/http/httptest" libhttptest "git.sr.ht/~shulhan/pakakeh.go/lib/test/httptest" ) func main() { var handler = func(w http.ResponseWriter, _ *http.Request) { w.Header().Set(`h1`, `v1`) w.Header().Set(`h2`, `v2`) w.Header().Set(`h3`, `v3`) _, _ = io.WriteString(w, `Hello world!`) } var ( ctx = context.Background() req *http.Request err error ) req, err = http.NewRequestWithContext(ctx, http.MethodGet, `/a/b/c`, nil) if err != nil { log.Fatal(err) } var recorder = httptest.NewRecorder() handler(recorder, req) var result = libhttptest.SimulateResult{ Response: recorder.Result(), } var got []byte got, err = result.DumpResponse([]string{`h1`}) if err != nil { log.Fatal(`DumpResponse #1:`, err) } fmt.Printf("<<< DumpResponse:\n%s\n", got) result.ResponseDump = nil got, err = result.DumpResponse([]string{`h3`}) if err != nil { log.Fatal(`DumpResponse #2:`, err) } fmt.Printf("<<< DumpResponse:\n%s", got) }
Output: <<< DumpResponse: HTTP/1.1 200 OK Connection: close Content-Type: text/plain; charset=utf-8 H2: v2 H3: v3 Hello world! <<< DumpResponse: HTTP/1.1 200 OK Connection: close Content-Type: text/plain; charset=utf-8 H1: v1 H2: v2 Hello world!