Skip to content

Commit

Permalink
Add support for Handle
Browse files Browse the repository at this point in the history
It allows full control over the handler
  • Loading branch information
maxcnunes committed Jul 18, 2017
1 parent 5103513 commit 117247c
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 18 deletions.
58 changes: 58 additions & 0 deletions examples/custom_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// nolint dupl
package examples

import (
"io/ioutil"
"net/http"
"testing"

"github.com/maxcnunes/httpfake"
)

// TestHandleCustomResponder tests a fake server handling a GET request
// with a custom responder. It allows full control over the handler.
func TestHandleCustomResponder(t *testing.T) {
fakeService := httpfake.New()
defer fakeService.Server.Close()

// register a handler for our fake service
fakeService.NewHandler().
Get("/users").
Handle(func(w http.ResponseWriter, r *http.Request, rh *httpfake.Request) {
w.WriteHeader(200)
w.Header().Add("Header-From-Custom-Responder-X", "indeed")
w.Write([]byte("Body-From-Custom-Responder-X")) // nolint
})

req, err := http.NewRequest("GET", fakeService.ResolveURL("/users"), nil)
if err != nil {
t.Fatal(err)
}

res, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatal(err)
}
defer res.Body.Close() // nolint errcheck

// Check the status code is what we expect
if status := res.StatusCode; status != 200 {
t.Errorf("request returned wrong status code: got %v want %v",
status, 200)
}

// Check the response body is what we expect
expected := "Body-From-Custom-Responder-X"
body, _ := ioutil.ReadAll(res.Body)
if bodyString := string(body); bodyString != expected {
t.Errorf("request returned unexpected body: got %v want %v",
bodyString, expected)
}

// Check the response header is what we expect
expected = "indeed"
if header := res.Header.Get("Header-From-Custom-Responder-X"); header != expected {
t.Errorf("request returned unexpected value for header Header-From-Custom-Responder-X: got %v want %v",
header, expected)
}
}
20 changes: 5 additions & 15 deletions httpfake.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ func New() *HTTPFake {
w.WriteHeader(http.StatusNotFound)
return
}
respond(rh, w)
if rh.CustomHandle != nil {
rh.CustomHandle(w, r, rh)
return
}
Respond(w, r, rh)
}))

return fake
Expand Down Expand Up @@ -70,17 +74,3 @@ func (f *HTTPFake) findHandler(r *http.Request) *Request {
}
return nil
}

func respond(rh *Request, w http.ResponseWriter) {
if rh.Response.StatusCode > 0 {
w.WriteHeader(rh.Response.StatusCode)
}
if len(rh.Response.BodyBuffer) > 0 {
w.Write(rh.Response.BodyBuffer) // nolint
}
if len(rh.Response.Header) > 0 {
for k := range rh.Response.Header {
w.Header().Add(k, rh.Response.Header.Get(k))
}
}
}
12 changes: 9 additions & 3 deletions request.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import (

// Request ...
type Request struct {
Method string
URL *url.URL
Response *Response
Method string
URL *url.URL
Response *Response
CustomHandle Responder
}

// NewRequest ...
Expand Down Expand Up @@ -55,6 +56,11 @@ func (r *Request) Reply(status int) *Response {
return r.Response.Status(status)
}

// Handle ...
func (r *Request) Handle(handle Responder) {
r.CustomHandle = handle
}

func (r *Request) method(method, path string) *Request {
if path != "/" {
r.URL.Path = path
Expand Down
21 changes: 21 additions & 0 deletions responder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package httpfake

import "net/http"

// Responder ...
type Responder func(w http.ResponseWriter, r *http.Request, rh *Request)

// Respond ...
func Respond(w http.ResponseWriter, r *http.Request, rh *Request) {
if rh.Response.StatusCode > 0 {
w.WriteHeader(rh.Response.StatusCode)
}
if len(rh.Response.BodyBuffer) > 0 {
w.Write(rh.Response.BodyBuffer) // nolint
}
if len(rh.Response.Header) > 0 {
for k := range rh.Response.Header {
w.Header().Add(k, rh.Response.Header.Get(k))
}
}
}

0 comments on commit 117247c

Please sign in to comment.