mod support;
use feignhttp::{HttpClient, HttpConfig, map};
use support::*;
use serde::{Serialize};
use hyper::body::HttpBody;
#[tokio::test]
async fn test_request() {
let server = server::http(0, move |req| async move {
assert_eq!(req.method(), "GET");
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "get";
let request = HttpClient::default_request(&url, method);
request.send().await.unwrap();
}
#[tokio::test]
async fn test_header() {
let server = server::http(0, move |req| async move {
assert_eq!(req.headers()["auth"], "name_pass");
assert_eq!(req.headers()["username"], "jack");
assert_eq!(req.headers()["pwd"], "xxx");
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "get";
let header_map = map!(
"auth" => "name_pass".to_string(),
"username" => "jack".to_string(),
"pwd" => "xxx".to_string());
let request = HttpClient::default_request(&url, method)
.headers(header_map);
request.send().await.unwrap();
}
#[tokio::test]
async fn test_query() {
let server = server::http(0, move |req| async move {
assert_eq!("id=1&name=xxx&name=xxx2", req.uri().query().unwrap());
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "get";
let query_vec = [
("id", "1".to_string()),
("name", "xxx".to_string()),
("name", "xxx2".to_string()),
].iter().cloned().collect();
let request = HttpClient::default_request(&url, method).query(&query_vec);
request.send().await.unwrap();
}
#[tokio::test]
async fn test_send_text() {
let server = server::http(0, move |mut req| async move {
let vec = req.body_mut().data().await.unwrap().unwrap().to_vec();
assert_eq!("I' m text", String::from_utf8(vec).unwrap());
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "post";
let text = r#"I' m text"#;
let request = HttpClient::default_request(&url, method);
request.send_text(text.to_string()).await.unwrap();
}
#[tokio::test]
async fn test_send_json() {
let server = server::http(0, move |mut req| async move {
let vec = req.body_mut().data().await.unwrap().unwrap().to_vec();
assert_eq!(r#"{"id":1,"name":"jack"}"#, String::from_utf8(vec).unwrap());
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "post";
#[derive(Serialize)]
struct User {
id: i32,
name: String,
}
let user = User {
id: 1,
name: "jack".to_string(),
};
let request = HttpClient::default_request(&url, method);
request.send_json(&user).await.unwrap();
}
#[tokio::test]
#[should_panic]
async fn test_connect_timeout() {
let url = "http://xxx.com";
let method = "get";
let config = HttpConfig{
connect_timeout: Some(3000), timeout: None,
};
let request = HttpClient::configure_request(&url, method, config);
request.send().await.unwrap();
}
#[tokio::test]
#[should_panic]
async fn test_timeout() {
let server = server::http(0, move |req| async move {
assert_eq!(req.method(), "GET");
std::thread::sleep(std::time::Duration::from_millis(5000));
hyper::Response::default()
});
let url = format!("http://{}", server.addr());
let method = "get";
let config = HttpConfig{
connect_timeout: None,
timeout: Some(3000), };
let request = HttpClient::configure_request(&url, method, config);
request.send().await.unwrap();
}