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_task_get_nonexistent_id() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let result = manager.get_task(99999).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Task not found"));
}
#[tokio::test]
async fn test_task_update_nonexistent_id() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let result = manager
.update_task(
99999,
TaskUpdate {
name: Some("New Name"),
..Default::default()
},
)
.await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Task not found"));
}
#[tokio::test]
async fn test_task_delete_nonexistent_id() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let result = manager.delete_task(99999).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Task not found"));
}
#[tokio::test]
async fn test_task_start_nonexistent_id() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let result = manager.start_task(99999, false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Task not found"));
}
#[tokio::test]
async fn test_task_depends_on_self() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task = manager
.add_task(
"Task 1".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = dependencies::add_dependency(db.pool(), task.id, task.id).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Circular dependency detected"));
}
#[tokio::test]
async fn test_task_circular_dependency_detection() {
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, task2.id)
.await
.unwrap();
dependencies::add_dependency(db.pool(), task2.id, task3.id)
.await
.unwrap();
let result = dependencies::add_dependency(db.pool(), task3.id, task1.id).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Circular dependency detected"));
}
#[tokio::test]
async fn test_task_depends_on_nonexistent_task() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task = manager
.add_task(
"Task 1".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = dependencies::add_dependency(db.pool(), task.id, 99999).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.to_string().contains("Task not found"));
}
#[tokio::test]
async fn test_task_update_invalid_priority() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task = manager
.add_task(
"Test Task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = PriorityLevel::parse_to_int("invalid");
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Invalid priority"));
let retrieved = manager.get_task(task.id).await.unwrap();
assert_eq!(retrieved.name, "Test Task");
}
#[tokio::test]
async fn test_pick_next_with_multiple_tasks() {
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();
manager
.add_task(
"Task 2".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
manager
.add_task(
"Task 3".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let result = manager.pick_next().await.unwrap();
assert!(result.task.is_some());
assert_eq!(result.task.unwrap().id, task1.id);
}
#[tokio::test]
async fn test_pick_next_with_all_tasks_completed() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task = manager
.add_task(
"Task 1".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
manager.start_task(task.id, false).await.unwrap();
manager.done_task(false).await.unwrap();
let result = manager.pick_next().await.unwrap();
assert!(result.task.is_none());
assert_eq!(result.suggestion_type, "NONE");
}
#[tokio::test]
async fn test_task_done_with_uncompleted_children() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let parent = manager
.add_task(
"Parent Task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
manager
.add_task(
"Child Task".to_string(),
None,
Some(parent.id),
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
manager.start_task(parent.id, false).await.unwrap();
let result = manager.done_task(false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("has uncompleted children")
|| error
.to_string()
.contains("Cannot complete task with incomplete subtasks")
|| error.to_string().contains("Uncompleted children")
);
}
#[tokio::test]
async fn test_task_done_without_current_task() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let workspace = WorkspaceManager::new(db.pool());
let current = workspace.get_current_task(None).await.unwrap();
assert!(current.current_task_id.is_none());
let result = manager.done_task(false).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error.to_string().contains("No task is currently focused")
|| error.to_string().contains("No current task")
);
}