1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
package gock
import (
"context"
"errors"
"io/ioutil"
"net/http"
"testing"
"time"
"github.com/nbio/st"
)
func TestResponder(t *testing.T) {
defer after()
mres := New("http://foo.com").Reply(200).BodyString("foo")
req := &http.Request{}
res, err := Responder(req, mres, nil)
st.Expect(t, err, nil)
st.Expect(t, res.Status, "200 OK")
st.Expect(t, res.StatusCode, 200)
body, _ := ioutil.ReadAll(res.Body)
st.Expect(t, string(body), "foo")
}
func TestResponder_ReadTwice(t *testing.T) {
defer after()
mres := New("http://foo.com").Reply(200).BodyString("foo")
req := &http.Request{}
res, err := Responder(req, mres, nil)
st.Expect(t, err, nil)
st.Expect(t, res.Status, "200 OK")
st.Expect(t, res.StatusCode, 200)
body, _ := ioutil.ReadAll(res.Body)
st.Expect(t, string(body), "foo")
body, err = ioutil.ReadAll(res.Body)
st.Expect(t, err, nil)
st.Expect(t, body, []byte{})
}
func TestResponderSupportsMultipleHeadersWithSameKey(t *testing.T) {
defer after()
mres := New("http://foo").
Reply(200).
AddHeader("Set-Cookie", "a=1").
AddHeader("Set-Cookie", "b=2")
req := &http.Request{}
res, err := Responder(req, mres, nil)
st.Expect(t, err, nil)
st.Expect(t, res.Header, http.Header{"Set-Cookie": []string{"a=1", "b=2"}})
}
func TestResponderError(t *testing.T) {
defer after()
mres := New("http://foo.com").ReplyError(errors.New("error"))
req := &http.Request{}
res, err := Responder(req, mres, nil)
st.Expect(t, err.Error(), "error")
st.Expect(t, res == nil, true)
}
func TestResponderCancelledContext(t *testing.T) {
defer after()
mres := New("http://foo.com").Get("").Reply(200).Delay(20 * time.Millisecond).BodyString("foo")
// create a context and schedule a call to cancel in 10ms
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(10 * time.Millisecond)
cancel()
}()
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "http://foo.com", nil)
res, err := Responder(req, mres, nil)
// verify that we got a context cancellation error and nil response
st.Expect(t, err, context.Canceled)
st.Expect(t, res == nil, true)
}
func TestResponderExpiredContext(t *testing.T) {
defer after()
mres := New("http://foo.com").Get("").Reply(200).Delay(20 * time.Millisecond).BodyString("foo")
// create a context that is set to expire in 10ms
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "http://foo.com", nil)
res, err := Responder(req, mres, nil)
// verify that we got a context cancellation error and nil response
st.Expect(t, err, context.DeadlineExceeded)
st.Expect(t, res == nil, true)
}
func TestResponderPreExpiredContext(t *testing.T) {
t.Skip("Fails up to 80% with go1.16 and up, skipping")
defer after()
mres := New("http://foo.com").Get("").Reply(200).BodyString("foo")
// create a context and wait to ensure it is expired
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Microsecond)
defer cancel()
time.Sleep(1 * time.Millisecond)
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "http://foo.com", nil)
res, err := Responder(req, mres, nil)
// verify that we got a context cancellation error and nil response
st.Expect(t, err, context.DeadlineExceeded)
st.Expect(t, res == nil, true)
}
|