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 }