gopkg.in/essentialkaos/ek.v3@v3.5.1/req/req_test.go (about)

     1  package req
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                     Copyright (c) 2009-2016 Essential Kaos                         //
     6  //      Essential Kaos Open Source License <http://essentialkaos.com/ekol?en>         //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"bytes"
    12  	"net"
    13  	"net/http"
    14  	"testing"
    15  	"time"
    16  
    17  	. "pkg.re/check.v1"
    18  
    19  	"pkg.re/essentialkaos/ek.v3/env"
    20  )
    21  
    22  // ////////////////////////////////////////////////////////////////////////////////// //
    23  
    24  const (
    25  	_URL_GET          = "/get"
    26  	_URL_POST         = "/post"
    27  	_URL_PUT          = "/put"
    28  	_URL_HEAD         = "/head"
    29  	_URL_PATCH        = "/patch"
    30  	_URL_DELETE       = "/delete"
    31  	_URL_QUERY        = "/query"
    32  	_URL_HEADERS      = "/headers"
    33  	_URL_CONTENT_TYPE = "/content-type"
    34  	_URL_ACCEPT       = "/accept"
    35  	_URL_USER_AGENT   = "/user-agent"
    36  	_URL_BASIC_AUTH   = "/basic-auth"
    37  	_URL_STRING_RESP  = "/string-response"
    38  	_URL_JSON_RESP    = "/json-response"
    39  	_URL_DISCARD      = "/discard"
    40  )
    41  
    42  const (
    43  	_TEST_USER_AGENT      = "REQ TEST USER AGENT"
    44  	_TEST_CONTENT_TYPE    = "application/json"
    45  	_TEST_ACCEPT          = "application/vnd.example.api+json;version=2"
    46  	_TEST_BASIC_AUTH_USER = "admin"
    47  	_TEST_BASIC_AUTH_PASS = "password"
    48  	_TEST_STRING_RESP     = "Test String Response"
    49  )
    50  
    51  const _DEFAULT_PORT = "30000"
    52  
    53  // ////////////////////////////////////////////////////////////////////////////////// //
    54  
    55  func Test(t *testing.T) { TestingT(t) }
    56  
    57  type ReqSuite struct {
    58  	url      string
    59  	listener net.Listener
    60  }
    61  
    62  type TestStruct struct {
    63  	String  string `json:"string"`
    64  	Integer int    `json:"integer"`
    65  	Boolean bool   `json:"boolean"`
    66  }
    67  
    68  // ////////////////////////////////////////////////////////////////////////////////// //
    69  
    70  var _ = Suite(&ReqSuite{})
    71  
    72  // ////////////////////////////////////////////////////////////////////////////////// //
    73  
    74  func (s *ReqSuite) SetUpSuite(c *C) {
    75  	s.url = "http://127.0.0.1:" + _DEFAULT_PORT
    76  
    77  	envVars := env.Get()
    78  
    79  	if envVars["EK_TEST_PORT"] != "" {
    80  		s.url = "http://127.0.0.1:" + envVars["EK_TEST_PORT"]
    81  	}
    82  
    83  	go runHTTPServer(s, c)
    84  
    85  	DialTimeout = 60.0
    86  	RequestTimeout = 60.0
    87  
    88  	time.Sleep(time.Second)
    89  }
    90  
    91  func (s *ReqSuite) TearDownSuite(c *C) {
    92  	if s.listener != nil {
    93  		s.listener.Close()
    94  	}
    95  }
    96  
    97  func (s *ReqSuite) TestMethodGet(c *C) {
    98  	getResp, err := Request{URL: s.url + _URL_GET, Method: GET}.Do()
    99  
   100  	c.Assert(err, IsNil)
   101  	c.Assert(getResp.StatusCode, Equals, 200)
   102  
   103  	getResp, err = Request{URL: s.url + _URL_GET}.Do()
   104  
   105  	c.Assert(err, IsNil)
   106  	c.Assert(getResp.StatusCode, Equals, 200)
   107  
   108  	getResp, err = Request{URL: s.url + _URL_GET}.Get()
   109  
   110  	c.Assert(err, IsNil)
   111  	c.Assert(getResp.StatusCode, Equals, 200)
   112  }
   113  
   114  func (s *ReqSuite) TestMethodPost(c *C) {
   115  	postResp, err := Request{URL: s.url + _URL_POST, Method: POST}.Do()
   116  
   117  	c.Assert(err, IsNil)
   118  	c.Assert(postResp.StatusCode, Equals, 200)
   119  
   120  	postResp, err = Request{URL: s.url + _URL_POST}.Post()
   121  
   122  	c.Assert(err, IsNil)
   123  	c.Assert(postResp.StatusCode, Equals, 200)
   124  }
   125  
   126  func (s *ReqSuite) TestMethodPut(c *C) {
   127  	putResp, err := Request{URL: s.url + _URL_PUT, Method: PUT}.Do()
   128  
   129  	c.Assert(err, IsNil)
   130  	c.Assert(putResp.StatusCode, Equals, 200)
   131  
   132  	putResp, err = Request{URL: s.url + _URL_PUT}.Put()
   133  
   134  	c.Assert(err, IsNil)
   135  	c.Assert(putResp.StatusCode, Equals, 200)
   136  }
   137  
   138  func (s *ReqSuite) TestMethodHead(c *C) {
   139  	headResp, err := Request{URL: s.url + _URL_HEAD, Method: HEAD}.Do()
   140  
   141  	c.Assert(err, IsNil)
   142  	c.Assert(headResp.StatusCode, Equals, 200)
   143  
   144  	headResp, err = Request{URL: s.url + _URL_HEAD}.Head()
   145  
   146  	c.Assert(err, IsNil)
   147  	c.Assert(headResp.StatusCode, Equals, 200)
   148  }
   149  
   150  func (s *ReqSuite) TestMethodPatch(c *C) {
   151  	patchResp, err := Request{URL: s.url + _URL_PATCH, Method: PATCH}.Do()
   152  
   153  	c.Assert(err, IsNil)
   154  	c.Assert(patchResp.StatusCode, Equals, 200)
   155  
   156  	patchResp, err = Request{URL: s.url + _URL_PATCH}.Patch()
   157  
   158  	c.Assert(err, IsNil)
   159  	c.Assert(patchResp.StatusCode, Equals, 200)
   160  }
   161  
   162  func (s *ReqSuite) TestMethodDelete(c *C) {
   163  	deleteResp, err := Request{URL: s.url + _URL_DELETE, Method: DELETE}.Do()
   164  
   165  	c.Assert(err, IsNil)
   166  	c.Assert(deleteResp.StatusCode, Equals, 200)
   167  
   168  	deleteResp, err = Request{URL: s.url + _URL_DELETE}.Delete()
   169  
   170  	c.Assert(err, IsNil)
   171  	c.Assert(deleteResp.StatusCode, Equals, 200)
   172  }
   173  
   174  func (s *ReqSuite) TestQuery(c *C) {
   175  	resp, err := Request{
   176  		URL: s.url + _URL_QUERY,
   177  		Query: Query{
   178  			"user": "john",
   179  			"id":   "912",
   180  			"root": "",
   181  		},
   182  	}.Do()
   183  
   184  	c.Assert(err, IsNil)
   185  	c.Assert(resp.StatusCode, Equals, 200)
   186  }
   187  
   188  func (s *ReqSuite) TestHeaders(c *C) {
   189  	resp, err := Request{
   190  		URL: s.url + _URL_HEADERS,
   191  		Headers: Headers{
   192  			"Header1": "Value1",
   193  			"Header2": "Value2",
   194  		},
   195  	}.Do()
   196  
   197  	c.Assert(err, IsNil)
   198  	c.Assert(resp.StatusCode, Equals, 200)
   199  }
   200  
   201  func (s *ReqSuite) TestContentType(c *C) {
   202  	resp, err := Request{
   203  		URL:         s.url + _URL_CONTENT_TYPE,
   204  		ContentType: _TEST_CONTENT_TYPE,
   205  	}.Do()
   206  
   207  	c.Assert(err, IsNil)
   208  	c.Assert(resp.StatusCode, Equals, 200)
   209  }
   210  
   211  func (s *ReqSuite) TestAccept(c *C) {
   212  	resp, err := Request{
   213  		URL:    s.url + _URL_ACCEPT,
   214  		Accept: _TEST_ACCEPT,
   215  	}.Do()
   216  
   217  	c.Assert(err, IsNil)
   218  	c.Assert(resp.StatusCode, Equals, 200)
   219  }
   220  
   221  func (s *ReqSuite) TestClose(c *C) {
   222  	getResp, err := Request{
   223  		URL:   s.url + _URL_GET,
   224  		Close: true,
   225  	}.Get()
   226  
   227  	c.Assert(err, IsNil)
   228  	c.Assert(getResp.StatusCode, Equals, 200)
   229  }
   230  
   231  func (s *ReqSuite) TestUserAgent(c *C) {
   232  	resp, err := Request{
   233  		URL:       s.url + _URL_USER_AGENT,
   234  		UserAgent: _TEST_USER_AGENT,
   235  	}.Do()
   236  
   237  	c.Assert(err, IsNil)
   238  	c.Assert(resp.StatusCode, Equals, 200)
   239  
   240  	UserAgent = _TEST_USER_AGENT
   241  
   242  	resp, err = Request{
   243  		URL: s.url + _URL_USER_AGENT,
   244  	}.Do()
   245  
   246  	c.Assert(err, IsNil)
   247  	c.Assert(resp.StatusCode, Equals, 200)
   248  }
   249  
   250  func (s *ReqSuite) TestBasicAuth(c *C) {
   251  	resp, err := Request{
   252  		URL:               s.url + _URL_BASIC_AUTH,
   253  		BasicAuthUsername: _TEST_BASIC_AUTH_USER,
   254  		BasicAuthPassword: _TEST_BASIC_AUTH_PASS,
   255  	}.Do()
   256  
   257  	c.Assert(err, IsNil)
   258  	c.Assert(resp.StatusCode, Equals, 200)
   259  }
   260  
   261  func (s *ReqSuite) TestStringResp(c *C) {
   262  	resp, err := Request{
   263  		URL: s.url + _URL_STRING_RESP,
   264  	}.Do()
   265  
   266  	c.Assert(err, IsNil)
   267  	c.Assert(resp.StatusCode, Equals, 200)
   268  	c.Assert(resp.String(), Equals, _TEST_STRING_RESP)
   269  }
   270  
   271  func (s *ReqSuite) TestJSONResp(c *C) {
   272  	resp, err := Request{
   273  		URL: s.url + _URL_JSON_RESP,
   274  	}.Do()
   275  
   276  	c.Assert(err, IsNil)
   277  	c.Assert(resp.StatusCode, Equals, 200)
   278  
   279  	testStruct := &TestStruct{}
   280  
   281  	err = resp.JSON(testStruct)
   282  
   283  	c.Assert(err, IsNil)
   284  	c.Assert(testStruct.String, Equals, "test")
   285  	c.Assert(testStruct.Integer, Equals, 912)
   286  	c.Assert(testStruct.Boolean, Equals, true)
   287  }
   288  
   289  func (s *ReqSuite) TestDiscard(c *C) {
   290  	resp, err := Request{
   291  		URL: s.url + _URL_JSON_RESP,
   292  	}.Do()
   293  
   294  	c.Assert(err, IsNil)
   295  	c.Assert(resp.StatusCode, Equals, 200)
   296  
   297  	resp.Discard()
   298  
   299  	resp, err = Request{
   300  		URL:         s.url + _URL_DISCARD,
   301  		AutoDiscard: true,
   302  	}.Do()
   303  
   304  	c.Assert(err, IsNil)
   305  	c.Assert(resp.StatusCode, Equals, 500)
   306  }
   307  
   308  func (s *ReqSuite) TestEncoding(c *C) {
   309  	resp, err := Request{
   310  		URL:  s.url + "/404",
   311  		Body: "DEADBEAF",
   312  	}.Do()
   313  
   314  	c.Assert(err, IsNil)
   315  	c.Assert(resp, NotNil)
   316  
   317  	resp, err = Request{
   318  		URL:  s.url + "/404",
   319  		Body: []byte("DEADBEAF"),
   320  	}.Do()
   321  
   322  	c.Assert(err, IsNil)
   323  	c.Assert(resp, NotNil)
   324  
   325  	r := bytes.NewReader([]byte("DEADBEAF"))
   326  
   327  	resp, err = Request{
   328  		URL:  s.url + "/404",
   329  		Body: r,
   330  	}.Do()
   331  
   332  	c.Assert(err, IsNil)
   333  	c.Assert(resp, NotNil)
   334  
   335  	k := struct{ t string }{"DEADBEAF"}
   336  
   337  	resp, err = Request{
   338  		URL:  s.url + "/404",
   339  		Body: k,
   340  	}.Do()
   341  
   342  	c.Assert(err, IsNil)
   343  	c.Assert(resp, NotNil)
   344  }
   345  
   346  func (s *ReqSuite) TestErrors(c *C) {
   347  	resp, err := Request{}.Do()
   348  
   349  	c.Assert(resp, IsNil)
   350  	c.Assert(err, NotNil)
   351  
   352  	resp, err = Request{URL: "ABCD"}.Do()
   353  
   354  	c.Assert(resp, IsNil)
   355  	c.Assert(err, NotNil)
   356  
   357  	resp, err = Request{URL: "http://127.0.0.1:60000"}.Do()
   358  
   359  	c.Assert(resp, IsNil)
   360  	c.Assert(err, NotNil)
   361  
   362  	resp, err = Request{URL: "%gh&%ij"}.Do()
   363  
   364  	c.Assert(resp, IsNil)
   365  	c.Assert(err, NotNil)
   366  
   367  	e1 := RequestError{ERROR_BODY_ENCODE, "Test 1"}
   368  	e2 := RequestError{ERROR_CREATE_REQUEST, "Test 2"}
   369  	e3 := RequestError{ERROR_SEND_REQUEST, "Test 3"}
   370  
   371  	c.Assert(e1.Error(), Equals, "Can't encode request body (Test 1)")
   372  	c.Assert(e2.Error(), Equals, "Can't create request struct (Test 2)")
   373  	c.Assert(e3.Error(), Equals, "Can't send request (Test 3)")
   374  }
   375  
   376  // ////////////////////////////////////////////////////////////////////////////////// //
   377  
   378  func runHTTPServer(s *ReqSuite, c *C) {
   379  	server := &http.Server{
   380  		Handler:        http.NewServeMux(),
   381  		ReadTimeout:    10 * time.Second,
   382  		WriteTimeout:   10 * time.Second,
   383  		MaxHeaderBytes: 1 << 20,
   384  	}
   385  
   386  	port := _DEFAULT_PORT
   387  	envVars := env.Get()
   388  
   389  	if envVars["EK_TEST_PORT"] != "" {
   390  		port = envVars["EK_TEST_PORT"]
   391  	}
   392  
   393  	listener, err := net.Listen("tcp", ":"+port)
   394  
   395  	if err != nil {
   396  		c.Fatal(err.Error())
   397  	}
   398  
   399  	s.listener = listener
   400  
   401  	server.Handler.(*http.ServeMux).HandleFunc(_URL_GET, getRequestHandler)
   402  	server.Handler.(*http.ServeMux).HandleFunc(_URL_POST, postRequestHandler)
   403  	server.Handler.(*http.ServeMux).HandleFunc(_URL_PUT, putRequestHandler)
   404  	server.Handler.(*http.ServeMux).HandleFunc(_URL_HEAD, headRequestHandler)
   405  	server.Handler.(*http.ServeMux).HandleFunc(_URL_PATCH, patchRequestHandler)
   406  	server.Handler.(*http.ServeMux).HandleFunc(_URL_DELETE, deleteRequestHandler)
   407  	server.Handler.(*http.ServeMux).HandleFunc(_URL_QUERY, queryRequestHandler)
   408  	server.Handler.(*http.ServeMux).HandleFunc(_URL_HEADERS, headersRequestHandler)
   409  	server.Handler.(*http.ServeMux).HandleFunc(_URL_CONTENT_TYPE, contentTypeRequestHandler)
   410  	server.Handler.(*http.ServeMux).HandleFunc(_URL_ACCEPT, acceptRequestHandler)
   411  	server.Handler.(*http.ServeMux).HandleFunc(_URL_USER_AGENT, uaRequestHandler)
   412  	server.Handler.(*http.ServeMux).HandleFunc(_URL_BASIC_AUTH, basicAuthRequestHandler)
   413  	server.Handler.(*http.ServeMux).HandleFunc(_URL_STRING_RESP, stringRespRequestHandler)
   414  	server.Handler.(*http.ServeMux).HandleFunc(_URL_JSON_RESP, jsonRespRequestHandler)
   415  	server.Handler.(*http.ServeMux).HandleFunc(_URL_DISCARD, discardRequestHandler)
   416  
   417  	err = server.Serve(listener)
   418  
   419  	if err != nil {
   420  		c.Fatal(err.Error())
   421  	}
   422  }
   423  
   424  func getRequestHandler(w http.ResponseWriter, r *http.Request) {
   425  	if r.Method != GET {
   426  		w.WriteHeader(801)
   427  		return
   428  	}
   429  
   430  	w.WriteHeader(200)
   431  }
   432  
   433  func postRequestHandler(w http.ResponseWriter, r *http.Request) {
   434  	if r.Method != POST {
   435  		w.WriteHeader(802)
   436  		return
   437  	}
   438  
   439  	w.WriteHeader(200)
   440  }
   441  
   442  func putRequestHandler(w http.ResponseWriter, r *http.Request) {
   443  	if r.Method != PUT {
   444  		w.WriteHeader(803)
   445  		return
   446  	}
   447  
   448  	w.WriteHeader(200)
   449  }
   450  func headRequestHandler(w http.ResponseWriter, r *http.Request) {
   451  	if r.Method != HEAD {
   452  		w.WriteHeader(804)
   453  		return
   454  	}
   455  
   456  	w.WriteHeader(200)
   457  }
   458  
   459  func patchRequestHandler(w http.ResponseWriter, r *http.Request) {
   460  	if r.Method != PATCH {
   461  		w.WriteHeader(805)
   462  		return
   463  	}
   464  
   465  	w.WriteHeader(200)
   466  }
   467  
   468  func deleteRequestHandler(w http.ResponseWriter, r *http.Request) {
   469  	if r.Method != DELETE {
   470  		w.WriteHeader(806)
   471  		return
   472  	}
   473  
   474  	w.WriteHeader(200)
   475  }
   476  
   477  func queryRequestHandler(w http.ResponseWriter, r *http.Request) {
   478  	query := r.URL.Query()
   479  
   480  	if query.Get("user") != "john" {
   481  		w.WriteHeader(900)
   482  		return
   483  	}
   484  
   485  	if query.Get("id") != "912" {
   486  		w.WriteHeader(901)
   487  		return
   488  	}
   489  
   490  	_, root := query["root"]
   491  
   492  	if !root {
   493  		w.WriteHeader(902)
   494  		return
   495  	}
   496  
   497  	w.WriteHeader(200)
   498  }
   499  
   500  func headersRequestHandler(w http.ResponseWriter, r *http.Request) {
   501  	header1 := r.Header["Header1"]
   502  
   503  	if len(header1) != 1 {
   504  		w.WriteHeader(910)
   505  		return
   506  	}
   507  
   508  	if header1[0] != "Value1" {
   509  		w.WriteHeader(911)
   510  		return
   511  	}
   512  
   513  	header2 := r.Header["Header2"]
   514  
   515  	if len(header2) != 1 {
   516  		w.WriteHeader(912)
   517  		return
   518  	}
   519  
   520  	if header2[0] != "Value2" {
   521  		w.WriteHeader(913)
   522  		return
   523  	}
   524  
   525  	w.WriteHeader(200)
   526  }
   527  
   528  func contentTypeRequestHandler(w http.ResponseWriter, r *http.Request) {
   529  	header := r.Header["Content-Type"]
   530  
   531  	if len(header) != 1 {
   532  		w.WriteHeader(920)
   533  		return
   534  	}
   535  
   536  	if header[0] != _TEST_CONTENT_TYPE {
   537  		w.WriteHeader(921)
   538  		return
   539  	}
   540  
   541  	w.WriteHeader(200)
   542  }
   543  
   544  func acceptRequestHandler(w http.ResponseWriter, r *http.Request) {
   545  	header := r.Header["Accept"]
   546  
   547  	if len(header) != 1 {
   548  		w.WriteHeader(930)
   549  		return
   550  	}
   551  
   552  	if header[0] != _TEST_ACCEPT {
   553  		w.WriteHeader(931)
   554  		return
   555  	}
   556  
   557  	w.WriteHeader(200)
   558  }
   559  
   560  func uaRequestHandler(w http.ResponseWriter, r *http.Request) {
   561  	if r.UserAgent() != _TEST_USER_AGENT {
   562  		w.WriteHeader(940)
   563  		return
   564  	}
   565  
   566  	w.WriteHeader(200)
   567  }
   568  
   569  func basicAuthRequestHandler(w http.ResponseWriter, r *http.Request) {
   570  	user, pass, ok := r.BasicAuth()
   571  
   572  	if !ok {
   573  		w.WriteHeader(950)
   574  		return
   575  	}
   576  
   577  	if user != _TEST_BASIC_AUTH_USER {
   578  		w.WriteHeader(951)
   579  		return
   580  	}
   581  
   582  	if pass != _TEST_BASIC_AUTH_PASS {
   583  		w.WriteHeader(952)
   584  		return
   585  	}
   586  
   587  	w.WriteHeader(200)
   588  }
   589  
   590  func stringRespRequestHandler(w http.ResponseWriter, r *http.Request) {
   591  	w.Write([]byte(_TEST_STRING_RESP))
   592  }
   593  
   594  func jsonRespRequestHandler(w http.ResponseWriter, r *http.Request) {
   595  	w.Write([]byte(`{
   596    "string": "test",
   597    "integer": 912,
   598    "boolean": true }`,
   599  	))
   600  }
   601  
   602  func discardRequestHandler(w http.ResponseWriter, r *http.Request) {
   603  	w.WriteHeader(500)
   604  
   605  	w.Write([]byte(`{
   606    "string": "test",
   607    "integer": 912,
   608    "boolean": true }`,
   609  	))
   610  }