use super::test_helpers::*;
use crate::claims;
use serde_json::json;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_claims_basic_properties() {
let claims = create_test_claims();
assert_eq!(claims.sub, TEST_USER_ID);
assert_eq!(claims.user_id(), TEST_USER_ID);
assert_eq!(claims.email(), Some(TEST_EMAIL));
assert_eq!(claims.phone(), Some(TEST_PHONE));
assert_eq!(claims.role(), "authenticated");
assert_eq!(claims.session_id.as_deref(), Some(TEST_SESSION_ID));
assert_eq!(claims.aud.as_deref(), Some("authenticated"));
assert_eq!(claims.iss.as_deref(), Some(TEST_ISSUER));
assert_eq!(claims.aal.as_deref(), Some("aal1"));
assert_eq!(claims.kid.as_deref(), Some(TEST_KID));
assert!(!claims.is_anonymous());
}
#[test]
fn test_claims_role_defaults() {
let mut claims = create_test_claims();
claims.role = None;
assert_eq!(claims.role(), "authenticated"); }
#[test]
fn test_claims_anonymous_defaults() {
let mut claims = create_test_claims();
claims.is_anonymous = None;
assert!(!claims.is_anonymous());
claims.is_anonymous = Some(true);
assert!(claims.is_anonymous());
}
#[test]
fn test_claims_security_validation() {
let claims = create_test_claims();
assert!(claims.validate_security().is_ok());
let mut invalid_claims = create_test_claims();
invalid_claims.sub = "".to_string();
assert!(invalid_claims.validate_security().is_err());
invalid_claims.sub = " ".to_string();
assert!(invalid_claims.validate_security().is_err());
}
#[test]
fn test_claims_metadata_access() {
let claims = create_test_claims();
let name: Option<String> = claims.get_user_metadata("name");
assert_eq!(name, Some("Test User".to_string()));
let non_existent: Option<String> = claims.get_user_metadata("non_existent");
assert_eq!(non_existent, None);
let provider: Option<String> = claims.get_app_metadata("provider");
assert_eq!(provider, Some("email".to_string()));
}
#[test]
fn test_claims_with_minimal_data() {
let claims = create_minimal_claims();
assert_eq!(claims.user_id(), TEST_USER_ID);
assert_eq!(claims.email(), None);
assert_eq!(claims.role(), "authenticated"); assert!(!claims.is_anonymous()); assert!(claims.validate_security().is_ok());
}
#[test]
fn test_claims_serialization() {
let claims = create_test_claims();
let serialized = serde_json::to_string(&claims).unwrap();
assert!(!serialized.is_empty());
let deserialized: claims::Claims = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized.sub, claims.sub);
assert_eq!(deserialized.email, claims.email);
}
#[test]
fn test_claims_with_complex_metadata() {
let mut claims = create_test_claims();
claims.user_metadata = Some(json!({
"nested": {
"deep": {
"value": "test"
}
},
"array": [1, 2, 3],
"boolean": true,
"null_value": null
}));
let nested: Option<serde_json::Value> = claims.get_user_metadata("nested");
assert!(nested.is_some());
}
#[test]
fn test_claims_validate_security_empty_subject() {
let mut claims = create_test_claims();
claims.sub = "".to_string();
let result = claims.validate_security();
assert!(result.is_err());
}
#[test]
fn test_claims_validate_security_whitespace_subject() {
let mut claims = create_test_claims();
claims.sub = " ".to_string();
let result = claims.validate_security();
assert!(result.is_err());
}
#[test]
fn test_claims_validate_security_valid_subject() {
let claims = create_test_claims();
let result = claims.validate_security();
assert!(result.is_ok());
}
#[test]
fn test_claims_key_id() {
let mut claims = create_test_claims();
assert_eq!(claims.kid.as_deref(), Some(TEST_KID));
claims.kid = None;
assert!(claims.kid.is_none());
claims.kid = Some("new-key-id".to_string());
assert_eq!(claims.kid.as_deref(), Some("new-key-id"));
}
#[test]
fn test_claims_metadata_missing_key() {
let claims = create_test_claims();
let result: Option<String> = claims.get_user_metadata("non_existent_key");
assert!(result.is_none());
let result: Option<String> = claims.get_app_metadata("non_existent_key");
assert!(result.is_none());
}
#[test]
fn test_claims_metadata_type_handling() {
let mut claims = create_test_claims();
claims.user_metadata = Some(json!({
"string_field": "test_value",
"number_field": 42
}));
let string_result: Option<String> = claims.get_user_metadata("string_field");
assert_eq!(string_result, Some("test_value".to_string()));
let number_result: Option<i32> = claims.get_user_metadata("number_field");
assert_eq!(number_result, Some(42));
}
#[test]
fn test_claims_basic_edge_cases() {
let mut claims = create_minimal_claims();
claims.sub = "".to_string();
assert!(claims.validate_security().is_err());
claims.sub = " ".to_string();
assert!(claims.validate_security().is_err());
}
#[test]
fn test_claims_role_variations() {
let mut claims = create_minimal_claims();
claims.role = Some("admin".to_string());
assert_eq!(claims.role(), "admin");
claims.role = Some("user".to_string());
assert_eq!(claims.role(), "user");
claims.role = Some("".to_string());
assert_eq!(claims.role(), "");
claims.role = None;
assert_eq!(claims.role(), "authenticated");
}
#[test]
fn test_claims_serialization_roundtrip() {
let original_claims = create_test_claims();
let json_str = serde_json::to_string(&original_claims).expect("Should serialize");
let deserialized_claims: claims::Claims =
serde_json::from_str(&json_str).expect("Should deserialize");
assert_eq!(original_claims.sub, deserialized_claims.sub);
assert_eq!(original_claims.exp, deserialized_claims.exp);
assert_eq!(original_claims.email, deserialized_claims.email);
assert_eq!(original_claims.role, deserialized_claims.role);
assert!(deserialized_claims.kid.is_none());
}
#[test]
fn test_claims_validate_security_enhanced() {
let invalid_cases = vec![
"", " ", ];
for invalid_sub in invalid_cases {
let mut claims = create_test_claims();
claims.sub = invalid_sub.to_string();
assert!(claims.validate_security().is_err());
}
let valid_cases = vec!["user123", "user@domain.com"];
for valid_sub in valid_cases {
let mut claims = create_test_claims();
claims.sub = valid_sub.to_string();
assert!(claims.validate_security().is_ok());
}
let mut claims = create_test_claims();
claims.sub = "a".repeat(256); assert!(claims.validate_security().is_ok());
}
#[test]
fn test_claims_metadata_basic_access() {
let mut claims = create_test_claims();
claims.user_metadata = Some(json!({
"name": "Test User",
"preferences": {
"theme": "dark"
},
"tags": ["admin", "user"]
}));
let name: Option<String> = claims.get_user_metadata("name");
assert_eq!(name, Some("Test User".to_string()));
let preferences: Option<serde_json::Value> = claims.get_user_metadata("preferences");
assert!(preferences.is_some());
let tags: Option<serde_json::Value> = claims.get_user_metadata("tags");
assert!(tags.is_some());
}
#[test]
fn test_claims_field_consistency() {
let claims = create_test_claims();
assert_eq!(claims.user_id(), &claims.sub);
assert_eq!(claims.email(), claims.email.as_deref());
assert_eq!(claims.phone(), claims.phone.as_deref());
assert_eq!(claims.session_id.as_deref(), claims.session_id.as_deref());
assert_eq!(claims.aud.as_deref(), claims.aud.as_deref());
assert_eq!(claims.iss.as_deref(), claims.iss.as_deref());
assert_eq!(claims.aal.as_deref(), claims.aal.as_deref());
assert_eq!(claims.amr.as_ref(), claims.amr.as_ref());
assert_eq!(claims.kid.as_deref(), claims.kid.as_deref());
assert_eq!(claims.is_anonymous(), claims.is_anonymous.unwrap_or(false));
}
#[test]
fn test_claims_default_values() {
let mut claims = create_test_claims();
claims.email = None;
claims.phone = None;
claims.role = None;
claims.aal = None;
claims.session_id = None;
claims.aud = None;
claims.iss = None;
claims.amr = None;
claims.user_metadata = None;
claims.app_metadata = None;
claims.is_anonymous = None;
claims.kid = None;
assert_eq!(claims.email(), None);
assert_eq!(claims.phone(), None);
assert_eq!(claims.role(), "authenticated"); assert!(!claims.is_anonymous()); assert_eq!(claims.kid, None);
}
#[test]
fn test_claims_subject_validation() {
let mut claims = create_test_claims();
claims.sub = "user123".to_string();
assert!(claims.validate_security().is_ok());
claims.sub = "user@example.com".to_string();
assert!(claims.validate_security().is_ok());
}
#[test]
fn test_claims_clone_and_equality() {
let original = create_test_claims();
let cloned = original.clone();
assert_eq!(original.sub, cloned.sub);
assert_eq!(original.exp, cloned.exp);
assert_eq!(original.email, cloned.email);
assert_eq!(original.phone, cloned.phone);
assert_eq!(original.role, cloned.role);
assert_eq!(original.session_id, cloned.session_id);
assert_eq!(original.aud, cloned.aud);
assert_eq!(original.iss, cloned.iss);
assert_eq!(original.aal, cloned.aal);
assert_eq!(original.is_anonymous, cloned.is_anonymous);
assert_eq!(original.kid, cloned.kid);
if let (Some(orig_user_meta), Some(cloned_user_meta)) =
(&original.user_metadata, &cloned.user_metadata)
{
assert_eq!(orig_user_meta, cloned_user_meta);
}
if let (Some(orig_app_meta), Some(cloned_app_meta)) =
(&original.app_metadata, &cloned.app_metadata)
{
assert_eq!(orig_app_meta, cloned_app_meta);
}
}
#[test]
fn test_claims_validation_performance() {
let base_claims = create_test_claims();
let test_subjects = (0..100).map(|i| format!("user_{i}")).collect::<Vec<_>>();
let start = std::time::Instant::now();
let mut validation_results = Vec::new();
for subject in test_subjects {
let mut claims = base_claims.clone();
claims.sub = subject;
let validation_result = claims.validate_security();
validation_results.push(validation_result.is_ok());
}
let duration = start.elapsed();
assert!(
duration.as_millis() < 50,
"100 validations should be very fast"
);
let success_count = validation_results.iter().filter(|&&result| result).count();
assert_eq!(
success_count, 100,
"All valid subjects should pass validation"
);
}
}