mod test_helpers_rewrite;
use intent_engine::{
dependencies,
priority::PriorityLevel,
tasks::{TaskManager, TaskUpdate},
workspace::WorkspaceManager,
};
use test_helpers_rewrite::TestDb;
#[tokio::test]
async fn test_pick_next_skips_blocked_task() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - Blocking".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - Blocked".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.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task1.id);
}
#[tokio::test]
async fn test_pick_next_recommends_after_blocking_complete() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - Blocking".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - Blocked".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task2.id)
.await
.unwrap();
manager
.update_task(
task1.id,
TaskUpdate {
status: Some("done"),
..Default::default()
},
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task2.id);
}
#[tokio::test]
async fn test_pick_next_multiple_dependencies() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - Blocker A".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - Blocker B".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task3 = manager
.add_task(
"Task 3 - Blocked by both".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
.update_task(
task1.id,
TaskUpdate {
status: Some("done"),
..Default::default()
},
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task2.id);
manager
.update_task(
task2.id,
TaskUpdate {
status: Some("done"),
..Default::default()
},
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task3.id);
}
#[tokio::test]
async fn test_pick_next_blocked_subtask() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let workspace = WorkspaceManager::new(db.pool());
let parent = manager
.add_task(
"Parent Task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let subtask1 = manager
.add_task(
"Subtask 1 - Blocker".to_string(),
None,
Some(parent.id),
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let subtask2 = manager
.add_task(
"Subtask 2 - Blocked".to_string(),
None,
Some(parent.id),
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), subtask1.id, subtask2.id)
.await
.unwrap();
workspace.set_current_task(parent.id, None).await.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, subtask1.id);
assert_eq!(result.suggestion_type, "FOCUSED_SUB_TASK");
}
#[tokio::test]
async fn test_pick_next_no_available_tasks_due_to_blocking() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - Blocked".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - Blocking".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task2.id, task1.id)
.await
.unwrap();
manager
.update_task(
task2.id,
TaskUpdate {
status: Some("doing"),
..Default::default()
},
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
let task = result.task.unwrap();
assert_eq!(task.id, task2.id);
assert_eq!(task.status, "doing");
assert_eq!(result.suggestion_type, "TOP_LEVEL_TASK");
}
#[tokio::test]
async fn test_pick_next_respects_priority_with_blocking() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - Low Priority".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - High Priority".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task3 = manager
.add_task(
"Task 3 - Medium Priority".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let low_priority = PriorityLevel::parse_to_int("low").unwrap();
let critical_priority = PriorityLevel::parse_to_int("critical").unwrap();
let medium_priority = PriorityLevel::parse_to_int("medium").unwrap();
manager
.update_task(
task1.id,
TaskUpdate {
priority: Some(low_priority),
..Default::default()
},
)
.await
.unwrap();
manager
.update_task(
task2.id,
TaskUpdate {
priority: Some(critical_priority),
..Default::default()
},
)
.await
.unwrap();
manager
.update_task(
task3.id,
TaskUpdate {
priority: Some(medium_priority),
..Default::default()
},
)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task1.id, task2.id)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task3.id);
}
#[tokio::test]
async fn test_pick_next_unblocked_task_normal_behavior() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Task 1 - No Dependencies".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Task 2 - No Dependencies".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task1.id);
manager
.update_task(
task1.id,
TaskUpdate {
status: Some("done"),
..Default::default()
},
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert_eq!(result.task.unwrap().id, task2.id);
}