gopkg.in/simversity/gottp.v3@v3.0.0-20160401065405-576cf030ca0e/tests/mock_server.go (about) 1 package tests 2 3 import ( 4 "bytes" 5 "errors" 6 "io/ioutil" 7 "net/http" 8 "net/http/httptest" 9 "strings" 10 11 "gopkg.in/simversity/gottp.v3" 12 "gopkg.in/simversity/gottp.v3/utils" 13 ) 14 15 type MockResponse struct { 16 Status int `json:"status"` 17 Message string `json:"message"` 18 Data interface{} `json:"data"` 19 Error error 20 } 21 22 type MockServer struct { 23 server *httptest.Server 24 } 25 26 type MockRequest struct { 27 Url string 28 Method string 29 Data map[string]interface{} 30 } 31 32 func (self *MockServer) Close() { 33 self.server.Close() 34 } 35 36 func (self *MockServer) Test(request *MockRequest, equality func(response *MockResponse)) { 37 var msg = new(MockResponse) 38 39 if request.Method == "" { 40 request.Method = "GET" 41 } 42 43 req, err := http.NewRequest( 44 strings.ToUpper(request.Method), 45 self.server.URL+request.Url, 46 bytes.NewBuffer(utils.Encoder(request.Data)), 47 ) 48 49 if err != nil { 50 msg.Error = err 51 equality(msg) 52 return 53 } 54 55 req.Header.Add("Content-Type", "application/json") 56 57 client := &http.Client{ 58 CheckRedirect: func(req *http.Request, via []*http.Request) error { 59 return errors.New("Redirecting =>" + req.URL.String()) 60 }, 61 } 62 63 resp, err := client.Do(req) 64 if err != nil { 65 status := 0 66 if strings.Contains(err.Error(), "Redirecting =>") { 67 status = 301 68 } 69 70 msg.Status = status 71 msg.Error = err 72 msg.Message = err.Error() 73 equality(msg) 74 return 75 } 76 77 data, err := ioutil.ReadAll(resp.Body) 78 resp.Body.Close() 79 if err != nil { 80 msg.Error = err 81 equality(msg) 82 return 83 } 84 85 utils.Decoder(data, msg) 86 equality(msg) 87 return 88 } 89 90 func NewServer() *MockServer { 91 ts := httptest.NewServer(http.HandlerFunc(gottp.GlobalHandler)) 92 return &MockServer{ts} 93 }