"""TDD — ui_commits 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: typing.Any) -> 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 # --------------------------------------------------------------------------- # C1 — ORM row exposes all fields used by the provenance block # --------------------------------------------------------------------------- @pytest.mark.asyncio async def test_c1_commit_orm_has_provenance_columns( db_session: AsyncSession, ) -> None: """MusehubCommit has all fields the commit detail provenance block reads.""" repo = await create_repo(db_session, owner="gabriel", visibility="public") row = await _add_commit( db_session, repo.repo_id, "commits-prov-c1", agent_id="claude-code", model_id="claude-sonnet-4-6", sem_ver_bump="patch", breaking_changes=["src/main.py::Fn"], signature="ed25519:SIG", signer_key_id="key-1", toolchain_id="muse-1", prompt_hash="abc", test_runs=1, reviewed_by=["alice"], ) assert not hasattr(row, "commit_meta") # These are the exact reads the provenance block in ui_commits.py must use provenance = { "sem_ver_bump": row.sem_ver_bump or "none", "agent_id": row.agent_id or "", "model_id": row.model_id or "", "toolchain_id": row.toolchain_id or "", "prompt_hash": row.prompt_hash or "", "signature": row.signature or "", "signer_key_id": row.signer_key_id or "", "format_version": 1, "reviewed_by": list(row.reviewed_by or []), "test_runs": int(row.test_runs or 0), "breaking_changes": list(row.breaking_changes or []), "is_agent": bool(row.agent_id), } assert provenance["agent_id"] == "claude-code" assert provenance["sem_ver_bump"] == "patch" assert provenance["breaking_changes"] == ["src/main.py::Fn"] assert provenance["test_runs"] == 1 assert provenance["signature"] == "ed25519:SIG" assert provenance["is_agent"] is True