From 43e274cfce9442191e6cc04e569c785b2aeccbf9 Mon Sep 17 00:00:00 2001 From: Marius Seritan Date: Sun, 24 May 2015 18:33:32 -0700 Subject: [PATCH] test(request): increasing test coverage of request module --- src/client/request.rs | 81 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/src/client/request.rs b/src/client/request.rs index d402af01ff..9e851027d0 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -15,6 +15,7 @@ use client::{Response, get_host_and_port}; /// A client request to a remote server. +/// The W type tracks the state of the request, Fresh vs Streaming. pub struct Request { /// The target URI for this request. pub url: Url, @@ -76,7 +77,6 @@ impl Request { /// returning a Streaming Request. pub fn start(mut self) -> ::Result> { let mut uri = self.url.serialize_path().unwrap(); - //TODO: this needs a test if let Some(ref q) = self.url.query { uri.push('?'); uri.push_str(&q[..]); @@ -174,22 +174,33 @@ impl Write for Request { mod tests { use std::str::from_utf8; use url::Url; - use method::Method::{Get, Head}; + use method::Method::{Get, Head, Post}; use mock::{MockStream, MockConnector}; + use net::Fresh; + use header::{ContentLength,TransferEncoding,Encoding}; + use url::form_urlencoded; use super::Request; + fn run_request(req: Request) -> Vec { + let req = req.start().unwrap(); + let stream = *req.body.end().unwrap() + .into_inner().unwrap().downcast::().ok().unwrap(); + stream.write + } + + fn assert_no_body(s: &str) { + assert!(!s.contains("Content-Length:")); + assert!(!s.contains("Transfer-Encoding:")); + } + #[test] fn test_get_empty_body() { let req = Request::with_connector( Get, Url::parse("http://example.dom").unwrap(), &mut MockConnector ).unwrap(); - let req = req.start().unwrap(); - let stream = *req.body.end().unwrap() - .into_inner().unwrap().downcast::().ok().unwrap(); - let bytes = stream.write; + let bytes = run_request(req); let s = from_utf8(&bytes[..]).unwrap(); - assert!(!s.contains("Content-Length:")); - assert!(!s.contains("Transfer-Encoding:")); + assert_no_body(s); } #[test] @@ -197,12 +208,56 @@ mod tests { let req = Request::with_connector( Head, Url::parse("http://example.dom").unwrap(), &mut MockConnector ).unwrap(); - let req = req.start().unwrap(); - let stream = *req.body.end().unwrap() - .into_inner().unwrap().downcast::().ok().unwrap(); - let bytes = stream.write; + let bytes = run_request(req); + let s = from_utf8(&bytes[..]).unwrap(); + assert_no_body(s); + } + + #[test] + fn test_url_query() { + let url = Url::parse("http://example.dom?q=value").unwrap(); + let req = Request::with_connector( + Get, url, &mut MockConnector + ).unwrap(); + let bytes = run_request(req); + let s = from_utf8(&bytes[..]).unwrap(); + assert!(s.contains("?q=value")); + } + + #[test] + fn test_post_content_length() { + let url = Url::parse("http://example.dom").unwrap(); + let mut req = Request::with_connector( + Post, url, &mut MockConnector + ).unwrap(); + let body = form_urlencoded::serialize(vec!(("q","value")).into_iter()); + req.headers_mut().set(ContentLength(body.len() as u64)); + let bytes = run_request(req); + let s = from_utf8(&bytes[..]).unwrap(); + assert!(s.contains("Content-Length:")); + } + + #[test] + fn test_post_chunked() { + let url = Url::parse("http://example.dom").unwrap(); + let req = Request::with_connector( + Post, url, &mut MockConnector + ).unwrap(); + let bytes = run_request(req); let s = from_utf8(&bytes[..]).unwrap(); assert!(!s.contains("Content-Length:")); - assert!(!s.contains("Transfer-Encoding:")); + } + + #[test] + fn test_post_chunked_with_encoding() { + let url = Url::parse("http://example.dom").unwrap(); + let mut req = Request::with_connector( + Post, url, &mut MockConnector + ).unwrap(); + req.headers_mut().set(TransferEncoding(vec![Encoding::Chunked])); + let bytes = run_request(req); + let s = from_utf8(&bytes[..]).unwrap(); + assert!(!s.contains("Content-Length:")); + assert!(s.contains("Transfer-Encoding:")); } }