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  }