"""TDD — ui_proposals must not read commit_meta.""" from __future__ import annotations import pytest from datetime import datetime, timezone from sqlalchemy.ext.asyncio import AsyncSession from muse.core.types import blob_id from musehub.db import musehub_repo_models as db from tests.factories import create_repo def _utc() -> datetime: return datetime.now(tz=timezone.utc) async def _add_commit(session: AsyncSession, repo_id: str, seed: str, **kwargs) -> db.MusehubCommit: row = db.MusehubCommit( commit_id=blob_id(seed.encode()), branch="dev", parent_ids=[], message=f"feat: {seed}", author="gabriel", timestamp=_utc(), **kwargs, ) session.add(row) session.add(db.MusehubCommitRef(repo_id=repo_id, commit_id=row.commit_id)) await session.commit() await session.refresh(row) return row # --------------------------------------------------------------------------- # P1 — ORM row has all columns the proposal enrichment loop needs # --------------------------------------------------------------------------- @pytest.mark.asyncio async def test_p1_proposal_commit_orm_columns( db_session: AsyncSession, ) -> None: """MusehubCommit row must have sem_ver_bump/agent_id/model_id/signature/breaking_changes.""" repo = await create_repo(db_session, owner="gabriel", visibility="public") row = await _add_commit( db_session, repo.repo_id, "prop-c1", agent_id="claude-code", model_id="claude-sonnet-4-6", sem_ver_bump="minor", breaking_changes=["src/api.py::handler"], signature="ed25519:SIG", ) assert not hasattr(row, "commit_meta") # Simulate the two enrichment loops in ui_proposals.py bump = str(row.sem_ver_bump or "none").lower() bc = row.breaking_changes breaking = [str(x) for x in bc if x] if isinstance(bc, list) else [] agent_id = str(row.agent_id or "") model_id = str(row.model_id or "") is_signed = bool(row.signature) assert bump == "minor" assert breaking == ["src/api.py::handler"] assert agent_id == "claude-code" assert model_id == "claude-sonnet-4-6" assert is_signed is True