91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
"""Tests for web UI CI path-filter gate (#436)."""
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
|
|
from webui.ci_paths import should_run_webui_ci, touches_webui_surface
|
|
from webui.lease_loader import load_lease_snapshot
|
|
from webui.queue_loader import load_queue_snapshot
|
|
from webui.runtime_health import load_runtime_snapshot
|
|
|
|
_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)
|
|
|
|
|
|
class TestOfflineWebuiCiMode(unittest.TestCase):
|
|
def test_offline_mode_avoids_live_queue_auth(self):
|
|
with mock.patch.dict(os.environ, {"WEBUI_TEST_OFFLINE": "1"}):
|
|
with mock.patch(
|
|
"webui.queue_loader.get_auth_header",
|
|
side_effect=AssertionError("live auth should not run"),
|
|
):
|
|
snapshot = load_queue_snapshot()
|
|
self.assertIsNone(snapshot.fetch_error)
|
|
self.assertEqual(snapshot.prs, ())
|
|
self.assertEqual(snapshot.issues, ())
|
|
|
|
def test_offline_mode_avoids_live_lease_auth(self):
|
|
with mock.patch.dict(os.environ, {"WEBUI_TEST_OFFLINE": "1"}):
|
|
with mock.patch(
|
|
"webui.lease_loader.get_auth_header",
|
|
side_effect=AssertionError("live auth should not run"),
|
|
):
|
|
snapshot = load_lease_snapshot()
|
|
self.assertIsNone(snapshot.fetch_error)
|
|
self.assertEqual(snapshot.reviewer_leases, ())
|
|
|
|
def test_offline_mode_avoids_live_runtime_identity(self):
|
|
with mock.patch.dict(os.environ, {"WEBUI_TEST_OFFLINE": "1"}):
|
|
with mock.patch(
|
|
"webui.runtime_health.get_auth_header",
|
|
side_effect=AssertionError("live auth should not run"),
|
|
):
|
|
snapshot = load_runtime_snapshot()
|
|
self.assertEqual(snapshot.identity_error, "offline web UI test mode")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|