diff options
Diffstat (limited to 'src/oauth2.rs')
-rw-r--r-- | src/oauth2.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/oauth2.rs b/src/oauth2.rs new file mode 100644 index 0000000..0c5f152 --- /dev/null +++ b/src/oauth2.rs @@ -0,0 +1,53 @@ +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<AccessToken, Error> { + 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())); + } +} |