aven-core 0.1.36

Core library for the Aven local-first task manager
Documentation
use aven_core::choices::{TaskPriority, TaskSource, TaskStatus};
use aven_core::db::Database;
use aven_core::operations::{TaskDraft, TaskUpdate};

fn draft(title: &str, project: &str, status: TaskStatus, priority: TaskPriority) -> TaskDraft {
    TaskDraft {
        title: title.to_string(),
        description: String::new(),
        project: Some(project.to_string()),
        status: status.to_string(),
        priority: priority.to_string(),
        source: TaskSource::Unknown,
        labels: Vec::new(),
        metadata: Vec::new(),
        available_at: None,
        due_on: None,
        is_epic: false,
    }
}

#[tokio::test]
async fn creation_promotes_only_inbox_tasks_with_actionable_priority() {
    let directory = tempfile::tempdir().unwrap();
    let database = Database::open(&directory.path().join("aven.sqlite"))
        .await
        .unwrap();
    let workspace = database.list_workspaces().await.unwrap().remove(0);
    let project = database
        .create_project(&workspace, "Core", None)
        .await
        .unwrap()
        .project;

    for priority in [
        TaskPriority::Medium,
        TaskPriority::High,
        TaskPriority::Urgent,
    ] {
        let created = database
            .create_task(
                &workspace,
                draft(priority.as_str(), &project.key, TaskStatus::Inbox, priority),
            )
            .await
            .unwrap();
        assert_eq!(created.task.status, TaskStatus::Todo);
    }

    let low = database
        .create_task(
            &workspace,
            draft(
                "low inbox",
                &project.key,
                TaskStatus::Inbox,
                TaskPriority::Low,
            ),
        )
        .await
        .unwrap();
    assert_eq!(low.task.status, TaskStatus::Inbox);

    let backlog = database
        .create_task(
            &workspace,
            draft(
                "urgent backlog",
                &project.key,
                TaskStatus::Backlog,
                TaskPriority::Urgent,
            ),
        )
        .await
        .unwrap();
    assert_eq!(backlog.task.status, TaskStatus::Backlog);
}

#[tokio::test]
async fn batch_priority_edit_promotes_only_current_inbox_tasks() {
    let directory = tempfile::tempdir().unwrap();
    let database = Database::open(&directory.path().join("aven.sqlite"))
        .await
        .unwrap();
    let workspace = database.list_workspaces().await.unwrap().remove(0);
    let project = database
        .create_project(&workspace, "Core", None)
        .await
        .unwrap()
        .project;
    let inbox = database
        .create_task(
            &workspace,
            draft("inbox", &project.key, TaskStatus::Inbox, TaskPriority::None),
        )
        .await
        .unwrap();
    let backlog = database
        .create_task(
            &workspace,
            draft(
                "backlog",
                &project.key,
                TaskStatus::Backlog,
                TaskPriority::None,
            ),
        )
        .await
        .unwrap();

    let low = database
        .update_task(
            &workspace,
            &inbox.task.id,
            TaskUpdate {
                priority: Some(TaskPriority::Low.to_string()),
                ..TaskUpdate::default()
            },
        )
        .await
        .unwrap();
    assert_eq!(low.task.status, TaskStatus::Inbox);
    assert_eq!(low.task.priority, TaskPriority::Low);

    let priority_update = TaskUpdate {
        priority: Some(TaskPriority::High.to_string()),
        ..TaskUpdate::default()
    };
    let outcomes = database
        .update_tasks(
            &workspace,
            vec![
                (inbox.task.id, priority_update.clone()),
                (backlog.task.id, priority_update),
            ],
        )
        .await
        .unwrap();
    assert_eq!(outcomes[0].task.status, TaskStatus::Todo);
    assert_eq!(outcomes[0].task.priority, TaskPriority::High);
    assert_eq!(outcomes[1].task.status, TaskStatus::Backlog);
    assert_eq!(outcomes[1].task.priority, TaskPriority::High);
}