"""TDD — musehub_proposals must not access commit_meta (dropped in migration 0020).""" 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.musehub_repo_models import MusehubBranch, MusehubCommit, MusehubCommitRef 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) -> MusehubCommit: row = MusehubCommit( commit_id=blob_id(seed.encode()), branch="feat/x", parent_ids=[], message=f"feat: {seed}", author="gabriel", timestamp=_utc(), **kwargs, ) session.add(row) session.add(MusehubCommitRef(repo_id=repo_id, commit_id=row.commit_id)) session.add(MusehubBranch( branch_id=blob_id(f"br-{seed}".encode()), repo_id=repo_id, name="feat/x", head_commit_id=row.commit_id, )) await session.commit() return row # --------------------------------------------------------------------------- # PR1 — _touched_symbols_for_branch does not crash on missing commit_meta # --------------------------------------------------------------------------- @pytest.mark.asyncio async def test_pr1_touched_symbols_no_commit_meta( db_session: AsyncSession, ) -> None: """_touched_symbols_for_branch must not raise AttributeError on commit_meta.""" from musehub.services.musehub_proposals import _touched_symbols_for_branch repo = await create_repo(db_session, owner="gabriel", visibility="public") await _add_commit(db_session, repo.repo_id, "pr1-c1", agent_id="claude-code") # Must not raise — returns [] since structured_delta is gone result = await _touched_symbols_for_branch(db_session, repo.repo_id, "feat/x") assert isinstance(result, list)