import sys
import tempfile
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from wflib import config as C
from test_claims import git
from test_cli import TOML
from test_setup import GitCli
GATE = TOML + 'quick_gate = ["echo \\"$WF_MAIN\\" > gate.txt", "echo second >> gate.txt"]\n'
class GateConfigTest(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.root = Path(self.tmp.name).resolve()
def tearDown(self):
self.tmp.cleanup()
def load(self, extra):
(self.root / "workflow.toml").write_text('format = 1\ntasks = "T.md"\narchive = "a.md"\n' + extra)
return C.load(self.root)
def test_default_empty(self):
self.assertEqual(self.load("").quick_gate, [])
def test_list(self):
self.assertEqual(self.load('quick_gate = ["make quick"]\n').quick_gate, ["make quick"])
def test_wrong_type(self):
with self.assertRaisesRegex(C.ConfigError, "'quick_gate' must be a list of strings"):
self.load('quick_gate = "make quick"\n')
class GateCliTest(GitCli):
toml = GATE
def setUp(self):
super().setUp()
self.wt = self.root / ".worktrees" / "opus"
git(self.root, "worktree", "add", "-q", str(self.wt), "-b", "opus/t-three")
def test_runs_in_worktree_with_wf_main(self):
code, out, err = self.wf("gate", project=False, cwd=self.wt / "docs")
self.assertEqual((code, err), (0, ""), out)
self.assertEqual((self.wt / "gate.txt").read_text(), f"{self.root}\nsecond\n")
self.assertFalse((self.root / "gate.txt").exists())
self.assertIn("$ echo second >> gate.txt\n", out)
self.assertTrue(out.endswith("quick_gate: 2 commands green\n"), out)
def test_runs_in_main_tree(self):
code, out, err = self.wf("gate", project=False, cwd=self.root)
self.assertEqual((code, err), (0, ""), out)
self.assertEqual((self.root / "gate.txt").read_text(), f"{self.root}\nsecond\n")
def test_red_exit_1_rest_skipped(self):
(self.wt / "workflow.toml").write_text(TOML + 'quick_gate = ["exit 4", "echo c > c.txt"]\n')
code, out, err = self.wf("gate", project=False, cwd=self.wt)
self.assertEqual(code, 1, out + err)
self.assertTrue(err.startswith("wf: quick_gate 'exit 4' red (exit 4): fix it before wf done; later commands skipped\n"), err)
self.assertIn("done+gate-red", err)
self.assertFalse((self.wt / "c.txt").exists())
def test_none_configured(self):
(self.wt / "workflow.toml").write_text(TOML)
code, out, err = self.wf("gate", project=False, cwd=self.wt)
self.assertEqual((code, out, err), (0, "no quick_gate in workflow.toml: nothing to do\n", ""))
if __name__ == "__main__":
unittest.main()