use rustc_serialize::json; use datatype::{AccessToken, Error, Url}; use http::Client; /// Authenticate with the specified OAuth2 server to retrieve a new `AccessToken`. pub fn authenticate(server: Url, client: &Client) -> Result { debug!("authenticating at {}", server); let resp_rx = client.post(server, None); let resp = resp_rx.recv().expect("no authenticate response received"); let data = try!(resp); let body = try!(String::from_utf8(data)); Ok(try!(json::decode(&body))) } #[cfg(test)] mod tests { use super::*; use datatype::{AccessToken, Url}; use http::TestClient; fn test_server() -> Url { "http://localhost:8000".parse().unwrap() } #[test] fn test_authenticate() { let token = r#"{ "access_token": "token", "token_type": "type", "expires_in": 10, "scope": "scope1 scope2" }"#; let client = TestClient::from(vec![token.to_string()]); let expect = AccessToken { access_token: "token".to_string(), token_type: "type".to_string(), expires_in: 10, scope: "scope1 scope2".to_string() }; assert_eq!(expect, authenticate(test_server(), &client).unwrap()); } #[test] fn test_authenticate_bad_json() { let client = TestClient::from(vec![r#"{"apa": 1}"#.to_string()]); let expect = r#"Failed to decode JSON: MissingFieldError("access_token")"#; assert_eq!(expect, format!("{}", authenticate(test_server(), &client).unwrap_err())); } }