workflow

git clone https://git.godosa.eu/workflow

master

raw ยท 2860 bytes

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()