use std::fs;
use std::process::Command;
use track::db::Database;
use track::services::{TaskService, TodoService, WorktreeService};
fn init_jj_repo(path: &str) {
Command::new("jj")
.args(["git", "init", path])
.output()
.unwrap();
}
fn describe_change(path: &str, message: &str) {
Command::new("jj")
.args(["-R", path, "describe", "-m", message])
.output()
.unwrap();
}
fn new_change(path: &str) {
Command::new("jj")
.args(["-R", path, "new"])
.output()
.unwrap();
}
fn create_bookmark(path: &str, name: &str) {
Command::new("jj")
.args(["-R", path, "bookmark", "create", name, "-r", "@"])
.output()
.unwrap();
}
#[test]
fn test_complete_worktree_without_base_worktree() {
let db = Database::new_in_memory().unwrap();
let task_service = TaskService::new(&db);
let todo_service = TodoService::new(&db);
let worktree_service = WorktreeService::new(&db);
let task = task_service
.create_task("Task", None, Some("ISSUE-123"), None)
.unwrap();
let todo = todo_service.add_todo(task.id, "Fix bug", true).unwrap();
let temp_dir = tempfile::tempdir().unwrap();
let repo_path = temp_dir.path().to_str().unwrap();
init_jj_repo(repo_path);
fs::write(temp_dir.path().join("README.md"), "init").unwrap();
describe_change(repo_path, "init");
new_change(repo_path);
create_bookmark(repo_path, "task/ISSUE-123");
let todo_wt = worktree_service
.add_worktree(
task.id,
repo_path,
None,
Some("ISSUE-123"),
Some(todo.id),
false, )
.unwrap();
fs::write(
std::path::Path::new(&todo_wt.path).join("fix.txt"),
"bug fixed",
)
.unwrap();
describe_change(&todo_wt.path, "fix bug");
new_change(&todo_wt.path);
let branch_name = worktree_service
.complete_worktree_for_todo(todo.id)
.unwrap();
assert!(branch_name.is_some());
assert_eq!(branch_name.unwrap(), todo_wt.branch);
let worktrees = worktree_service.list_worktrees(task.id).unwrap();
assert_eq!(worktrees.len(), 0);
assert!(std::path::Path::new(repo_path).join("fix.txt").exists());
}