mod test_helpers_rewrite;
use intent_engine::{dependencies, tasks::TaskManager};
use test_helpers_rewrite::TestDb;
#[tokio::test]
async fn test_start_task_blocked_by_incomplete_dependency() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task A".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task B".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task2.id)
.await
.unwrap();
let result = manager.start_task(task2.id, false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("TASK_BLOCKED")
|| error.to_string().contains("blocked")
|| error.to_string().contains("dependencies")
);
}
#[tokio::test]
async fn test_start_task_allowed_after_dependency_completed() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task A".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task B".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task2.id)
.await
.unwrap();
manager.start_task(task1.id, false).await.unwrap();
manager.done_task(false).await.unwrap();
let result = manager.start_task(task2.id, false).await;
assert!(result.is_ok());
let response = result.unwrap();
assert_eq!(response.task.status, "doing");
}
#[tokio::test]
async fn test_start_task_blocked_by_multiple_dependencies() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task3 = manager
.add_task(
"Task 3".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task3.id)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task2.id, task3.id)
.await
.unwrap();
let result = manager.start_task(task3.id, false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("TASK_BLOCKED")
|| error.to_string().contains("blocked")
|| error.to_string().contains("dependencies")
);
}
#[tokio::test]
async fn test_start_task_with_partial_dependencies_completed() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task3 = manager
.add_task(
"Task 3".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task3.id)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task2.id, task3.id)
.await
.unwrap();
manager.start_task(task1.id, false).await.unwrap();
manager.done_task(false).await.unwrap();
let result = manager.start_task(task3.id, false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("TASK_BLOCKED")
|| error.to_string().contains("blocked")
|| error.to_string().contains("dependencies")
);
}
#[tokio::test]
async fn test_start_task_no_dependencies_allowed() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task = manager
.add_task(
"Independent Task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = manager.start_task(task.id, false).await;
assert!(result.is_ok());
let response = result.unwrap();
assert_eq!(response.task.status, "doing");
}
#[tokio::test]
async fn test_start_task_blocked_by_doing_dependency() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task A".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task B".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task2.id)
.await
.unwrap();
manager.start_task(task1.id, false).await.unwrap();
let result = manager.start_task(task2.id, false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("TASK_BLOCKED")
|| error.to_string().contains("blocked")
|| error.to_string().contains("dependencies")
);
}