"""Tests for web UI CI path-filter gate (#436).""" import os import subprocess import sys import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from webui.ci_paths import should_run_webui_ci, touches_webui_surface _REPO_ROOT = Path(__file__).resolve().parent.parent class TestCiPathMatching(unittest.TestCase): def test_positive_paths(self): for path in ( "webui/app.py", "tests/test_webui_skeleton.py", "docs/webui-local-dev.md", "scripts/test-webui", ): with self.subTest(path=path): self.assertTrue(touches_webui_surface(path)) def test_negative_paths(self): for path in ("mcp_server.py", "tests/test_mcp_server.py", "README.md"): with self.subTest(path=path): self.assertFalse(touches_webui_surface(path)) def test_should_run_aggregate(self): self.assertTrue(should_run_webui_ci(["README.md", "webui/layout.py"])) self.assertFalse(should_run_webui_ci(["mcp_server.py", "gitea_auth.py"])) class TestCiRunnerScript(unittest.TestCase): def test_test_webui_smoke(self): script = _REPO_ROOT / "scripts" / "test-webui" result = subprocess.run( ["bash", str(script), "-q"], cwd=_REPO_ROOT, capture_output=True, text=True, timeout=60, env={ **os.environ, "WEBUI_TEST_PATTERN": "test_webui_skeleton.py", }, ) self.assertEqual(result.returncode, 0, result.stderr or result.stdout) if __name__ == "__main__": unittest.main()