from pathlib import Path from sqlalchemy import inspect from sqlalchemy.orm import Session as DbSession from hqt.config import Settings from hqt.db.engine import ensure_db, get_engine, get_session_factory from hqt.db.models import Harness, Project, Session def _tmp_settings(tmp_path: Path) -> Settings: return Settings(db_path=tmp_path / "test.db") def test_ensure_db_creates_tables(tmp_path): settings = _tmp_settings(tmp_path) ensure_db(settings) engine = get_engine(settings) tables = inspect(engine).get_table_names() assert "projects" in tables assert "sessions" in tables assert "harnesses" in tables assert "mcp_servers" in tables assert "project_mcp_servers" in tables assert "project_skills" in tables def test_project_crud(tmp_path): settings = _tmp_settings(tmp_path) ensure_db(settings) engine = get_engine(settings) factory = get_session_factory(engine) with factory() as session: p = Project(name="test", path="/tmp/test") session.add(p) session.commit() assert p.id is not None p.name = "updated" session.commit() fetched = session.get(Project, p.id) assert fetched.name == "updated" session.delete(fetched) session.commit() assert session.get(Project, p.id) is None def test_session_with_fk(tmp_path): settings = _tmp_settings(tmp_path) ensure_db(settings) engine = get_engine(settings) factory = get_session_factory(engine) with factory() as session: p = Project(name="proj", path="/tmp/proj") h = Harness(name="claude-code") session.add_all([p, h]) session.commit() s = Session( project_id=p.id, harness_id=h.id, tmux_session_name="hqt-test-1", ) session.add(s) session.commit() assert s.project.name == "proj" assert s.harness.name == "claude-code" assert s in p.sessions