Files
k-photos/crates/domain/tests/entities/ingest_session.rs

50 lines
1.6 KiB
Rust

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);
}
}