diff --git a/src/token/bearer.rs b/src/token/bearer.rs index 2d8485c..a001589 100644 --- a/src/token/bearer.rs +++ b/src/token/bearer.rs @@ -7,7 +7,7 @@ use client::response::{FromResponse, ParseError, JsonHelper}; /// The bearer token type. /// /// See [RFC 6750](http://tools.ietf.org/html/rfc6750). -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub struct Bearer { access_token: String, scope: Option, @@ -57,3 +57,110 @@ impl FromResponse for Bearer { Bearer::from_response_and_lifetime(json, lifetime) } } + +#[cfg(test)] +mod tests { + use chrono::{UTC, Duration}; + use rustc_serialize::json::Json; + + use client::response::{FromResponse, ParseError}; + use token::{Static, Expiring}; + use super::Bearer; + + #[test] + fn from_response_with_invalid_token_type() { + let json = Json::from_str(r#"{"token_type":"MAC","access_token":"aaaaaaaa"}"#).unwrap(); + assert_eq!( + ParseError::ExpectedFieldValue("token_type", "Bearer"), + Bearer::::from_response(&json).unwrap_err() + ); + } + + #[test] + fn from_response_capital_b() { + let json = Json::from_str(r#"{"token_type":"Bearer","access_token":"aaaaaaaa"}"#).unwrap(); + assert_eq!( + Bearer { + access_token: String::from("aaaaaaaa"), + scope: None, + lifetime: Static, + }, + Bearer::::from_response(&json).unwrap() + ); + } + + #[test] + fn from_response_little_b() { + let json = Json::from_str(r#"{"token_type":"bearer","access_token":"aaaaaaaa"}"#).unwrap(); + assert_eq!( + Bearer { + access_token: String::from("aaaaaaaa"), + scope: None, + lifetime: Static, + }, + Bearer::::from_response(&json).unwrap() + ); + } + + #[test] + fn from_response_with_scope() { + let json = Json::from_str( + r#"{"token_type":"Bearer","access_token":"aaaaaaaa","scope":"foo"}"# + ).unwrap(); + assert_eq!( + Bearer { + access_token: String::from("aaaaaaaa"), + scope: Some(String::from("foo")), + lifetime: Static, + }, + Bearer::::from_response(&json).unwrap() + ); + } + + #[test] + fn from_response_expiring() { + let json = Json::from_str(r#" + { + "token_type":"Bearer", + "access_token":"aaaaaaaa", + "expires_in":3600, + "refresh_token":"bbbbbbbb" + } + "#).unwrap(); + let bearer = Bearer::::from_response(&json).unwrap(); + assert_eq!("aaaaaaaa", bearer.access_token); + assert_eq!(None, bearer.scope); + let expiring = bearer.lifetime; + assert_eq!("bbbbbbbb", expiring.refresh_token()); + assert!(expiring.expires() > &UTC::now()); + assert!(expiring.expires() <= &(UTC::now() + Duration::seconds(3600))); + } + + #[test] + fn from_response_inherit_expiring() { + let json = Json::from_str(r#" + { + "token_type":"Bearer", + "access_token":"aaaaaaaa", + "expires_in":3600, + "refresh_token":"bbbbbbbb" + } + "#).unwrap(); + let prev = Bearer::::from_response(&json).unwrap(); + + let json = Json::from_str(r#" + { + "token_type":"Bearer", + "access_token":"cccccccc", + "expires_in":3600 + } + "#).unwrap(); + let bearer = Bearer::::from_response_inherit(&json, &prev).unwrap(); + assert_eq!("cccccccc", bearer.access_token); + assert_eq!(None, bearer.scope); + let expiring = bearer.lifetime; + assert_eq!("bbbbbbbb", expiring.refresh_token()); + assert!(expiring.expires() > &UTC::now()); + assert!(expiring.expires() <= &(UTC::now() + Duration::seconds(3600))); + } +}