domain: add Processing entities and ports (Job, JobBatch, Plugin, Pipeline)
This commit is contained in:
53
crates/domain/tests/entities/job.rs
Normal file
53
crates/domain/tests/entities/job.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
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(_))));
|
||||
}
|
||||
31
crates/domain/tests/entities/job_batch.rs
Normal file
31
crates/domain/tests/entities/job_batch.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
use domain::entities::{BatchStatus, JobBatch};
|
||||
|
||||
#[test]
|
||||
fn completes_when_all_done() {
|
||||
let mut batch = JobBatch::new("scan", 3);
|
||||
batch.record_completion();
|
||||
batch.record_completion();
|
||||
batch.record_completion();
|
||||
assert_eq!(batch.status, BatchStatus::Completed);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn completes_with_errors() {
|
||||
let mut batch = JobBatch::new("scan", 3);
|
||||
batch.record_completion();
|
||||
batch.record_failure();
|
||||
batch.record_completion();
|
||||
assert_eq!(batch.status, BatchStatus::CompletedWithErrors);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn progress_tracking() {
|
||||
let mut batch = JobBatch::new("scan", 4);
|
||||
assert_eq!(batch.progress_percent(), 0.0);
|
||||
|
||||
batch.record_completion();
|
||||
assert_eq!(batch.progress_percent(), 25.0);
|
||||
|
||||
batch.record_completion();
|
||||
assert_eq!(batch.progress_percent(), 50.0);
|
||||
}
|
||||
@@ -16,3 +16,6 @@ mod tag;
|
||||
mod share_scope;
|
||||
mod share_link;
|
||||
mod sidecar_record;
|
||||
mod job;
|
||||
mod job_batch;
|
||||
mod processing_pipeline;
|
||||
|
||||
17
crates/domain/tests/entities/processing_pipeline.rs
Normal file
17
crates/domain/tests/entities/processing_pipeline.rs
Normal file
@@ -0,0 +1,17 @@
|
||||
use domain::entities::ProcessingPipeline;
|
||||
use domain::value_objects::{StructuredData, SystemId};
|
||||
|
||||
#[test]
|
||||
fn steps_ordered() {
|
||||
let mut pipeline = ProcessingPipeline::new("asset.created");
|
||||
assert!(pipeline.steps.is_empty());
|
||||
|
||||
pipeline.add_step(SystemId::new(), StructuredData::new());
|
||||
pipeline.add_step(SystemId::new(), StructuredData::new());
|
||||
pipeline.add_step(SystemId::new(), StructuredData::new());
|
||||
|
||||
assert_eq!(pipeline.steps.len(), 3);
|
||||
assert_eq!(pipeline.steps[0].step_order, 0);
|
||||
assert_eq!(pipeline.steps[1].step_order, 1);
|
||||
assert_eq!(pipeline.steps[2].step_order, 2);
|
||||
}
|
||||
Reference in New Issue
Block a user