summaryrefslogtreecommitdiff
path: root/src/oauth2.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/oauth2.rs')
-rw-r--r--src/oauth2.rs53
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()));
+ }
+}