use application::processing::{StartJobCommand, StartJobHandler}; use application::testing::InMemoryJobRepository; use domain::entities::{Job, JobStatus, JobType}; use domain::errors::DomainError; use domain::ports::JobRepository; use domain::value_objects::StructuredData; use std::sync::Arc; #[tokio::test] async fn starts_queued_job() { let job_repo = Arc::new(InMemoryJobRepository::new()); let job = Job::new(JobType::ExtractMetadata, 5, StructuredData::new()); let job_id = job.job_id; job_repo.save(&job).await.unwrap(); let handler = StartJobHandler::new(job_repo.clone()); let result = handler.execute(StartJobCommand { job_id }).await.unwrap(); assert_eq!(result.status, JobStatus::Processing); assert!(result.started_at.is_some()); } #[tokio::test] async fn rejects_non_queued_job() { let job_repo = Arc::new(InMemoryJobRepository::new()); let mut job = Job::new(JobType::ExtractMetadata, 5, StructuredData::new()); job.start().unwrap(); // now Processing let job_id = job.job_id; job_repo.save(&job).await.unwrap(); let handler = StartJobHandler::new(job_repo.clone()); let result = handler.execute(StartJobCommand { job_id }).await; assert!(matches!(result, Err(DomainError::Conflict(_)))); }