use domain::entities::{IngestSession, IngestStatus}; use domain::errors::DomainError; use domain::value_objects::{Checksum, SystemId}; fn make_session() -> IngestSession { let checksum = Checksum::new("a".repeat(64)).unwrap(); IngestSession::new( SystemId::new(), "device-1", "photo.jpg", checksum, SystemId::new(), ) } #[test] fn valid_state_transitions() { let mut s = make_session(); assert_eq!(s.status, IngestStatus::Uploading); s.advance_to(IngestStatus::AwaitingProcessing).unwrap(); assert_eq!(s.status, IngestStatus::AwaitingProcessing); s.advance_to(IngestStatus::Processing).unwrap(); assert_eq!(s.status, IngestStatus::Processing); s.advance_to(IngestStatus::Completed).unwrap(); assert_eq!(s.status, IngestStatus::Completed); } #[test] fn invalid_transition_rejected() { let mut s = make_session(); let result = s.advance_to(IngestStatus::Completed); assert!(matches!(result, Err(DomainError::Validation(_)))); } #[test] fn can_fail_from_any_non_terminal() { for target in [IngestStatus::Uploading, IngestStatus::AwaitingProcessing, IngestStatus::Processing] { let mut s = make_session(); // advance to target state if target == IngestStatus::AwaitingProcessing || target == IngestStatus::Processing { s.advance_to(IngestStatus::AwaitingProcessing).unwrap(); } if target == IngestStatus::Processing { s.advance_to(IngestStatus::Processing).unwrap(); } s.advance_to(IngestStatus::Failed).unwrap(); assert_eq!(s.status, IngestStatus::Failed); } }