use chrono::{Duration, Utc}; use domain::entities::{LinkAccessLevel, ScopeType, ShareLink, ShareScope, ShareableType}; use domain::value_objects::{DateTimeStamp, SystemId}; // --- ShareScope --- #[test] fn not_expired_when_no_expiry() { let scope = ShareScope::new( ScopeType::Link, ShareableType::Album, SystemId::new(), SystemId::new(), ); assert!(!scope.is_expired()); } #[test] fn expired_when_past() { let mut scope = ShareScope::new( ScopeType::Link, ShareableType::Album, SystemId::new(), SystemId::new(), ); scope.expires_at = Some(DateTimeStamp::from_datetime( Utc::now() - Duration::hours(1), )); assert!(scope.is_expired()); } // --- ShareLink --- #[test] fn new_link_is_valid() { let link = ShareLink::new(SystemId::new(), "tok123", LinkAccessLevel::ViewOnly); assert!(link.is_valid()); assert_eq!(link.use_count, 0); } #[test] fn deactivated_invalid() { let mut link = ShareLink::new(SystemId::new(), "tok123", LinkAccessLevel::ViewOnly); link.deactivate(); assert!(!link.is_valid()); } #[test] fn max_uses_exhausted() { let mut link = ShareLink::new(SystemId::new(), "tok123", LinkAccessLevel::ViewOnly); link.max_uses = Some(2); link.record_use(); link.record_use(); assert!(!link.is_valid()); }