use domain::entities::{Job, JobStatus, JobType}; use domain::errors::DomainError; use domain::value_objects::StructuredData; #[test] fn job_lifecycle_success() { let mut job = Job::new(JobType::ExtractMetadata, 5, StructuredData::new()); assert_eq!(job.status, JobStatus::Queued); job.start().unwrap(); assert_eq!(job.status, JobStatus::Processing); assert!(job.started_at.is_some()); job.complete(StructuredData::new()); assert_eq!(job.status, JobStatus::Completed); assert!(job.result_data.is_some()); assert!(job.completed_at.is_some()); } #[test] fn retry_on_failure() { let mut job = Job::new(JobType::ScanDirectory, 1, StructuredData::new()); job.start().unwrap(); job.fail("timeout"); assert_eq!(job.status, JobStatus::Queued); assert_eq!(job.retry_count, 1); assert!(job.can_retry()); assert!(job.started_at.is_none()); } #[test] fn fails_after_max_retries() { let mut job = Job::new(JobType::ScanDirectory, 1, StructuredData::new()); job.max_retries = 2; job.start().unwrap(); job.fail("err1"); assert_eq!(job.status, JobStatus::Queued); job.start().unwrap(); job.fail("err2"); assert_eq!(job.status, JobStatus::Failed); assert!(!job.can_retry()); } #[test] fn cannot_start_from_processing() { let mut job = Job::new(JobType::ScanDirectory, 1, StructuredData::new()); job.start().unwrap(); let result = job.start(); assert!(matches!(result, Err(DomainError::Conflict(_)))); }