aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/tests/test_runner.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_runner.py')
-rw-r--r--tests/test_runner.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/tests/test_runner.py b/tests/test_runner.py
new file mode 100644
index 0000000..a095f2b
--- /dev/null
+++ b/tests/test_runner.py
@@ -0,0 +1,81 @@
+import sys
+import unittest
+from pathlib import Path
+
+HERE = Path(__file__).resolve().parent.parent
+sys.path.insert(0, str(HERE))
+sys.path.insert(0, str(HERE / "tests"))
+
+import test_cli # noqa: E402
+
+TASKS = """\
+# Tasks — demo
+
+## Awaiting your decision
+
+## Pending
+
+- **t-ok** [P1] (1h): Good. Headless.
+ Done: tests green.
+
+- **t-nodone** [P1] (1h): No done line.
+
+- **t-owner** [P1] (1h): Owner bound.
+ Done: tests green.
+ Sessions: owner
+
+- **t-confirm** [P1] (1h): Confirm.
+ Done: owner confirms it works.
+
+- **t-report** [P1] (1h): Report.
+ - Done: report to the owner.
+
+- **t-parent** [P1] (5h): Parent.
+ Done: all slices.
+ Slices: [[t-parent-1]]
+
+- **t-parent-1** [P1] (1h): Slice.
+ Done: ok.
+ Model: sonnet
+
+- **t-doneparent** [P1] (10h): Slices all archived.
+ Done: all slices.
+ - Slices: [[t-gone]]
+
+- **t-blk** [P1] (1h) (blocked: [[a-x]]): Blocked.
+ Done: ok.
+"""
+
+
+class Runner(test_cli.Cli):
+ tasks_text = TASKS
+
+ def col(self, *args):
+ return [l.split()[0] for l in self.ok("list", *args).splitlines()[:-1]]
+
+ def test_runner_filter(self):
+ self.assertEqual(self.col("--runner"), ["t-ok", "t-parent-1"])
+ self.assertEqual(self.col("--runner", "--model", "sonnet"), ["t-parent-1"])
+
+ def test_add_hint_without_done(self):
+ code, out, err = self.wf("add", "-p", "2", "-e", "1h", "Plain thing", hints=True)
+ self.assertEqual((code, err), (0, "hint: no Done line; add one (--done) so runners can pick it\n"))
+
+ def test_add_no_hint_with_done_or_awaiting(self):
+ code, out, err = self.wf("add", "-p", "2", "-e", "1h", "--body", "Body thing", stdin="Done: x\n", hints=True)
+ self.assertEqual((code, err), (0, ""))
+ code, out, err = self.wf("add", "-s", "awaiting", "Which one?", hints=True)
+ self.assertEqual((code, err), (0, ""))
+
+ def test_add_done_flag_writes_done_line(self):
+ code, out, err = self.wf("add", "-p", "2", "-e", "1h", "--done", "gate ALL GREEN", "Flagged thing", hints=True)
+ self.assertEqual((code, err), (0, ""))
+ self.assertIn("\n Done: gate ALL GREEN\n", self.ok("show", "t-flagged-thing") + "\n")
+
+ def test_add_p0_without_done_warns(self):
+ code, out, err = self.wf("add", "-p", "0", "-e", "1h", "Urgent thing", hints=True)
+ self.assertEqual((code, err), (0, 'wf: warning: P0 without Done line is not runner-pickable; use --done "<text>"\n'))
+
+
+if __name__ == "__main__":
+ unittest.main()