1use assert_cmd::cargo::cargo_bin_cmd;
2use predicates::prelude::*;
3use tempfile::TempDir;
4
5fn td(home: &TempDir) -> assert_cmd::Command {
6 let mut cmd = cargo_bin_cmd!("td");
7 cmd.env("HOME", home.path());
8 cmd
9}
10
11fn init_tmp() -> TempDir {
12 let tmp = TempDir::new().unwrap();
13 td(&tmp)
14 .args(["project", "init", "main"])
15 .current_dir(&tmp)
16 .assert()
17 .success();
18 tmp
19}
20
21fn create_task(dir: &TempDir, title: &str) -> String {
22 let out = td(dir)
23 .args(["--json", "create", title])
24 .current_dir(dir)
25 .output()
26 .unwrap();
27 let v: serde_json::Value = serde_json::from_slice(&out.stdout).unwrap();
28 v["id"].as_str().unwrap().to_string()
29}
30
31#[test]
32fn label_add_and_list() {
33 let tmp = init_tmp();
34 let id = create_task(&tmp, "Tag me");
35
36 td(&tmp)
37 .args(["label", "add", &id, "important"])
38 .current_dir(&tmp)
39 .assert()
40 .success()
41 .stdout(predicate::str::contains("added"));
42
43 td(&tmp)
44 .args(["label", "list", &id])
45 .current_dir(&tmp)
46 .assert()
47 .success()
48 .stdout(predicate::str::contains("important"));
49}
50
51#[test]
52fn label_rm_removes_label() {
53 let tmp = init_tmp();
54 let id = create_task(&tmp, "Untag me");
55
56 td(&tmp)
57 .args(["label", "add", &id, "temp"])
58 .current_dir(&tmp)
59 .assert()
60 .success();
61 td(&tmp)
62 .args(["label", "rm", &id, "temp"])
63 .current_dir(&tmp)
64 .assert()
65 .success();
66
67 td(&tmp)
68 .args(["label", "list", &id])
69 .current_dir(&tmp)
70 .assert()
71 .success()
72 .stdout(predicate::str::is_empty());
73}
74
75#[test]
76fn label_list_all_shows_distinct_labels() {
77 let tmp = init_tmp();
78 let a = create_task(&tmp, "A");
79 let b = create_task(&tmp, "B");
80
81 td(&tmp)
82 .args(["label", "add", &a, "bug"])
83 .current_dir(&tmp)
84 .assert()
85 .success();
86 td(&tmp)
87 .args(["label", "add", &b, "bug"])
88 .current_dir(&tmp)
89 .assert()
90 .success();
91 td(&tmp)
92 .args(["label", "add", &b, "ui"])
93 .current_dir(&tmp)
94 .assert()
95 .success();
96
97 td(&tmp)
98 .args(["label", "list-all"])
99 .current_dir(&tmp)
100 .assert()
101 .success()
102 .stdout(predicate::str::contains("bug"))
103 .stdout(predicate::str::contains("ui"));
104}