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
25#[test]
26fn label_add_and_list() {
27 let tmp = init_tmp();
28 let id = create_task(&tmp, "Tag me");
29
30 td().args(["label", "add", &id, "important"])
31 .current_dir(&tmp)
32 .assert()
33 .success()
34 .stdout(predicate::str::contains("added"));
35
36 td().args(["label", "list", &id])
37 .current_dir(&tmp)
38 .assert()
39 .success()
40 .stdout(predicate::str::contains("important"));
41}
42
43#[test]
44fn label_rm_removes_label() {
45 let tmp = init_tmp();
46 let id = create_task(&tmp, "Untag me");
47
48 td().args(["label", "add", &id, "temp"])
49 .current_dir(&tmp)
50 .assert()
51 .success();
52 td().args(["label", "rm", &id, "temp"])
53 .current_dir(&tmp)
54 .assert()
55 .success();
56
57 td().args(["label", "list", &id])
58 .current_dir(&tmp)
59 .assert()
60 .success()
61 .stdout(predicate::str::is_empty());
62}
63
64#[test]
65fn label_list_all_shows_distinct_labels() {
66 let tmp = init_tmp();
67 let a = create_task(&tmp, "A");
68 let b = create_task(&tmp, "B");
69
70 td().args(["label", "add", &a, "bug"])
71 .current_dir(&tmp)
72 .assert()
73 .success();
74 td().args(["label", "add", &b, "bug"])
75 .current_dir(&tmp)
76 .assert()
77 .success();
78 td().args(["label", "add", &b, "ui"])
79 .current_dir(&tmp)
80 .assert()
81 .success();
82
83 td().args(["label", "list-all"])
84 .current_dir(&tmp)
85 .assert()
86 .success()
87 .stdout(predicate::str::contains("bug"))
88 .stdout(predicate::str::contains("ui"));
89}