mod test_helpers_rewrite;
use intent_engine::{
db::models::Task,
priority::PriorityLevel,
tasks::{TaskManager, TaskUpdate},
};
use test_helpers_rewrite::TestDb;
#[tokio::test]
async fn test_priority_critical() {
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 critical = PriorityLevel::parse_to_int("critical").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(critical),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 1);
}
#[tokio::test]
async fn test_priority_high() {
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 high = PriorityLevel::parse_to_int("high").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(high),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 2);
}
#[tokio::test]
async fn test_priority_medium() {
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 medium = PriorityLevel::parse_to_int("medium").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(medium),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 3);
}
#[tokio::test]
async fn test_priority_low() {
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 low = PriorityLevel::parse_to_int("low").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(low),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 4);
}
#[tokio::test]
async fn test_priority_case_insensitive() {
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 high = PriorityLevel::parse_to_int("HIGH").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(high),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 2);
let critical = PriorityLevel::parse_to_int("CriTiCaL").unwrap();
let updated = manager
.update_task(
task.id,
TaskUpdate {
priority: Some(critical),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(updated.priority.unwrap(), 1);
}
#[tokio::test]
async fn test_priority_invalid_string() {
let result = PriorityLevel::parse_to_int("invalid");
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Invalid priority"));
let result = PriorityLevel::parse_to_int("");
assert!(result.is_err());
let result = PriorityLevel::parse_to_int("1");
assert!(result.is_err());
}
#[tokio::test]
async fn test_priority_ordering_still_works() {
let db = TestDb::new().await;
let manager = TaskManager::new(db.pool());
let task1 = manager
.add_task(
"Low priority task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task2 = manager
.add_task(
"Critical priority task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let task3 = manager
.add_task(
"Medium priority task".to_string(),
None,
None,
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let low = PriorityLevel::parse_to_int("low").unwrap();
let critical = PriorityLevel::parse_to_int("critical").unwrap();
let medium = PriorityLevel::parse_to_int("medium").unwrap();
manager
.update_task(
task1.id,
TaskUpdate {
priority: Some(low),
..Default::default()
},
)
.await
.unwrap();
manager
.update_task(
task2.id,
TaskUpdate {
priority: Some(critical),
..Default::default()
},
)
.await
.unwrap();
manager
.update_task(
task3.id,
TaskUpdate {
priority: Some(medium),
..Default::default()
},
)
.await
.unwrap();
let all_tasks: Vec<Task> = sqlx::query_as(
"SELECT id, parent_id, name, spec, status, complexity, priority, \
first_todo_at, first_doing_at, first_done_at, active_form, owner, metadata \
FROM tasks ORDER BY id",
)
.fetch_all(db.pool())
.await
.unwrap();
assert_eq!(all_tasks.len(), 3);
assert_eq!(all_tasks[0].priority.unwrap(), 4); assert_eq!(all_tasks[1].priority.unwrap(), 1); assert_eq!(all_tasks[2].priority.unwrap(), 3); }
#[tokio::test]
async fn test_task_list_filtering() {
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 _subtask = manager
.add_task(
"Subtask 1".to_string(),
None,
Some(task1.id),
Some("human".to_string()),
None,
None,
)
.await
.unwrap();
let all_tasks: Vec<Task> = sqlx::query_as(
"SELECT id, parent_id, name, spec, status, complexity, priority, \
first_todo_at, first_doing_at, first_done_at, active_form, owner, metadata \
FROM tasks",
)
.fetch_all(db.pool())
.await
.unwrap();
assert_eq!(all_tasks.len(), 3);
let todo_tasks: Vec<Task> = sqlx::query_as(
"SELECT id, parent_id, name, spec, status, complexity, priority, \
first_todo_at, first_doing_at, first_done_at, active_form, owner, metadata \
FROM tasks WHERE status = ?",
)
.bind("todo")
.fetch_all(db.pool())
.await
.unwrap();
assert_eq!(todo_tasks.len(), 3);
let children: Vec<Task> = sqlx::query_as(
"SELECT id, parent_id, name, spec, status, complexity, priority, \
first_todo_at, first_doing_at, first_done_at, active_form, owner, metadata \
FROM tasks WHERE parent_id = ?",
)
.bind(task1.id)
.fetch_all(db.pool())
.await
.unwrap();
assert_eq!(children.len(), 1);
assert_eq!(children[0].name, "Subtask 1");
let top_level: Vec<Task> = sqlx::query_as(
"SELECT id, parent_id, name, spec, status, complexity, priority, \
first_todo_at, first_doing_at, first_done_at, active_form, owner, metadata \
FROM tasks WHERE parent_id IS NULL",
)
.fetch_all(db.pool())
.await
.unwrap();
assert_eq!(top_level.len(), 2);
}