8dbf628dd6
- New: services/project_engine.py (async subprocess manager) - New: services/pyenv_manager.py (Python version + venv + git clone) - New: services/web_panel/routes/projects.py (5 REST endpoints) - New: static/web_panel/pages/projects.html (WebUI) - Tests: 28/28 passing, API verified (GET /api/projects) - Docs: Phase1_Progress.md (local)
47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
import pytest, asyncio, os, sys, time
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
|
|
|
class TestProjectEngine:
|
|
@pytest.fixture
|
|
def engine(self):
|
|
from services.project_engine import ProjectEngine
|
|
return ProjectEngine()
|
|
|
|
def test_list_empty(self, engine):
|
|
assert engine.list_projects() == []
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_run_stop_project(self, engine):
|
|
ok = await engine.run_project("test_sleep", ["sleep", "10"], cwd=".")
|
|
assert ok is True
|
|
assert "test_sleep" in engine.projects
|
|
assert engine.projects["test_sleep"].status == "running"
|
|
# Stop
|
|
ok2 = await engine.stop_project("test_sleep")
|
|
assert ok2 is True
|
|
|
|
def test_get_logs(self, engine):
|
|
engine.projects["dummy"] = type("obj",(),{"log_buffer":["line1","line2","line3"]})()
|
|
logs = engine.get_logs("dummy", tail=2)
|
|
assert len(logs) == 2
|
|
|
|
class TestPyEnvManager:
|
|
def test_detect_versions(self):
|
|
from services.pyenv_manager import PyEnvManager
|
|
mgr = PyEnvManager("~/test_pyenv_tmp")
|
|
versions = mgr.detect_versions()
|
|
assert len(versions) >= 1
|
|
assert any(v.startswith("3.") for v in versions)
|
|
|
|
def test_venv_creation(self):
|
|
from services.pyenv_manager import PyEnvManager
|
|
import tempfile, shutil
|
|
tmp = tempfile.mkdtemp()
|
|
try:
|
|
mgr = PyEnvManager(tmp)
|
|
venv = mgr.create_venv("test_venv")
|
|
assert venv is not None
|
|
assert (venv / "bin" / "python").exists() or (venv / "bin" / "python3").exists()
|
|
finally:
|
|
shutil.rmtree(tmp, ignore_errors=True)
|