use super::*;
use chrono::Duration;
use proptest::prelude::*;
#[test]
fn test_user_new() {
let id = "user123".to_string();
let account = "test@example.com".to_string();
let label = "Test User".to_string();
let user = User::new(id.clone(), account.clone(), label.clone());
assert_eq!(user.id, id);
assert_eq!(user.account, account);
assert_eq!(user.label, label);
assert!(!user.is_admin);
assert_eq!(user.sequence_number, None);
let now = Utc::now();
let one_second_ago = now - Duration::seconds(1);
assert!(user.created_at > one_second_ago);
assert!(user.updated_at > one_second_ago);
assert_eq!(user.created_at, user.updated_at);
}
#[test]
fn test_has_admin_privileges_with_is_admin_true() {
let mut user = User::new(
"user123".to_string(),
"test@example.com".to_string(),
"Test User".to_string(),
);
user.is_admin = true;
let has_privileges = user.has_admin_privileges();
assert!(has_privileges);
}
#[test]
fn test_has_admin_privileges_with_sequence_number_1() {
let mut user = User::new(
"user123".to_string(),
"test@example.com".to_string(),
"Test User".to_string(),
);
user.is_admin = false;
user.sequence_number = Some(1);
let has_privileges = user.has_admin_privileges();
assert!(has_privileges);
}
#[test]
fn test_has_admin_privileges_with_no_privileges() {
let mut user = User::new(
"user123".to_string(),
"test@example.com".to_string(),
"Test User".to_string(),
);
user.is_admin = false;
user.sequence_number = Some(2);
let has_privileges = user.has_admin_privileges();
assert!(!has_privileges);
}
proptest! {
#[test]
fn test_user_serde_roundtrip(
id in "[a-zA-Z0-9_-]{1,64}",
account in "[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,64}\\.[a-zA-Z]{2,8}",
label in "[\\p{L}\\p{N}\\p{P}\\p{Z}]{1,128}",
is_admin in proptest::bool::ANY,
sequence_number in proptest::option::of(1..10000i64)
) {
let now = Utc::now();
let user = User {
id,
account,
label,
is_admin,
sequence_number,
created_at: now,
updated_at: now,
};
let serialized = serde_json::to_string(&user).expect("Failed to serialize");
let deserialized: User = serde_json::from_str(&serialized).expect("Failed to deserialize");
prop_assert_eq!(user.id, deserialized.id);
prop_assert_eq!(user.account, deserialized.account);
prop_assert_eq!(user.label, deserialized.label);
prop_assert_eq!(user.is_admin, deserialized.is_admin);
prop_assert_eq!(deserialized.sequence_number, None);
}
#[test]
fn test_user_new_properties(
id in "[a-zA-Z0-9_-]{1,64}",
account in "[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,64}\\.[a-zA-Z]{2,8}",
label in "[\\p{L}\\p{N}\\p{P}\\p{Z}]{1,128}"
) {
let user = User::new(id.clone(), account.clone(), label.clone());
prop_assert_eq!(user.id, id);
prop_assert_eq!(user.account, account);
prop_assert_eq!(user.label, label);
prop_assert_eq!(user.is_admin, false);
prop_assert_eq!(user.sequence_number, None);
prop_assert_eq!(user.created_at, user.updated_at);
let now = Utc::now();
let one_second_ago = now - Duration::seconds(1);
prop_assert!(user.created_at > one_second_ago);
}
#[test]
fn test_has_admin_privileges_properties(
is_admin in proptest::bool::ANY,
sequence_number in proptest::option::of(0..10000i64)
) {
let mut user = User::new(
"test_user".to_string(),
"test@example.com".to_string(),
"Test User".to_string()
);
user.is_admin = is_admin;
user.sequence_number = sequence_number;
let expected_has_privileges = is_admin || sequence_number == Some(1);
prop_assert_eq!(user.has_admin_privileges(), expected_has_privileges);
}
}