cli_dep.rs

 1use assert_cmd::Command;
 2use predicates::prelude::*;
 3use tempfile::TempDir;
 4
 5fn td() -> Command {
 6    Command::cargo_bin("td").unwrap()
 7}
 8
 9fn init_tmp() -> TempDir {
10    let tmp = TempDir::new().unwrap();
11    td().arg("init").current_dir(&tmp).assert().success();
12    tmp
13}
14
15fn create_task(dir: &TempDir, title: &str) -> String {
16    let out = td()
17        .args(["--json", "create", title])
18        .current_dir(dir)
19        .output()
20        .unwrap();
21    let v: serde_json::Value = serde_json::from_slice(&out.stdout).unwrap();
22    v["id"].as_str().unwrap().to_string()
23}
24
25fn get_task_json(dir: &TempDir, id: &str) -> serde_json::Value {
26    let out = td()
27        .args(["--json", "show", id])
28        .current_dir(dir)
29        .output()
30        .unwrap();
31    serde_json::from_slice(&out.stdout).unwrap()
32}
33
34#[test]
35fn dep_add_creates_blocker() {
36    let tmp = init_tmp();
37    let a = create_task(&tmp, "Blocked task");
38    let b = create_task(&tmp, "Blocker");
39
40    td().args(["dep", "add", &a, &b])
41        .current_dir(&tmp)
42        .assert()
43        .success()
44        .stdout(predicate::str::contains("blocked by"));
45
46    let t = get_task_json(&tmp, &a);
47    let blockers = t["blockers"].as_array().unwrap();
48    assert!(blockers.contains(&serde_json::Value::String(b)));
49}
50
51#[test]
52fn dep_rm_removes_blocker() {
53    let tmp = init_tmp();
54    let a = create_task(&tmp, "Was blocked");
55    let b = create_task(&tmp, "Was blocker");
56
57    td().args(["dep", "add", &a, &b])
58        .current_dir(&tmp)
59        .assert()
60        .success();
61    td().args(["dep", "rm", &a, &b])
62        .current_dir(&tmp)
63        .assert()
64        .success();
65
66    let t = get_task_json(&tmp, &a);
67    let blockers = t["blockers"].as_array().unwrap();
68    assert!(blockers.is_empty());
69}
70
71#[test]
72fn dep_tree_shows_children() {
73    let tmp = init_tmp();
74    let parent = create_task(&tmp, "Parent");
75
76    td().args(["create", "Child one", "--parent", &parent])
77        .current_dir(&tmp)
78        .assert()
79        .success();
80    td().args(["create", "Child two", "--parent", &parent])
81        .current_dir(&tmp)
82        .assert()
83        .success();
84
85    td().args(["dep", "tree", &parent])
86        .current_dir(&tmp)
87        .assert()
88        .success()
89        .stdout(predicate::str::contains(&parent))
90        .stdout(predicate::str::contains(".1"))
91        .stdout(predicate::str::contains(".2"));
92}