gabriel / musehub public
test_mcp_executor_no_commit_meta.py python
81 lines 2.7 KB
Raw
sha256:a34090cc4a394a78bd72cbbe34b08cc59525141e19135b6c0ab154f10611b9ef debug(push/stream): instrument O-frame decode path with INF… Sonnet 4.6 patch 121 days ago
1 """TDD — musehub_mcp_executor must not access commit_meta (dropped in migration 0020)."""
2 from __future__ import annotations
3
4 import pytest
5 from muse.core.types import blob_id
6 from datetime import datetime, timezone
7 from sqlalchemy.ext.asyncio import AsyncSession
8
9 from musehub.db import musehub_models as db
10 from tests.factories import create_repo
11
12
13 def _utc() -> datetime:
14 return datetime.now(tz=timezone.utc)
15
16
17 async def _add_commit(session: AsyncSession, repo_id: str, seed: str, **kwargs) -> db.MusehubCommit:
18 row = db.MusehubCommit(
19 commit_id=blob_id(seed.encode()),
20 repo_id=repo_id,
21 branch="feat/mcp",
22 parent_ids=[],
23 message=f"feat: {seed}",
24 author="gabriel",
25 timestamp=_utc(),
26 **kwargs,
27 )
28 session.add(row)
29 session.add(db.MusehubBranch(
30 branch_id=blob_id(f"br-{seed}".encode()),
31 repo_id=repo_id,
32 name="feat/mcp",
33 head_commit_id=row.commit_id,
34 ))
35 await session.commit()
36 return row
37
38
39 async def _add_proposal(session: AsyncSession, repo_id: str, seed: str) -> db.MusehubProposal:
40 from musehub.core.genesis import compute_proposal_id
41 proposal_id = blob_id(f"proposal-{seed}".encode())
42 row = db.MusehubProposal(
43 proposal_id=proposal_id,
44 proposal_number=1,
45 repo_id=repo_id,
46 title=f"proposal {seed}",
47 body="",
48 state="open",
49 from_branch="feat/mcp",
50 to_branch="dev",
51 author="gabriel",
52 created_at=_utc(),
53 )
54 session.add(row)
55 await session.commit()
56 return row
57
58
59 # ---------------------------------------------------------------------------
60 # MCP1 — _extract_proposal_symbol_data does not crash on commit_meta
61 # ---------------------------------------------------------------------------
62
63 @pytest.mark.asyncio
64 async def test_mcp1_extract_proposal_symbol_data_no_commit_meta(
65 db_session: AsyncSession,
66 ) -> None:
67 """_extract_proposal_symbol_data must not raise AttributeError on commit_meta."""
68 from musehub.services.musehub_mcp_executor import _extract_proposal_symbol_data
69
70 repo = await create_repo(db_session, owner="gabriel", visibility="public")
71 await _add_commit(
72 db_session, repo.repo_id, "mcp1-c1",
73 agent_id="claude-code", model_id="claude-sonnet-4-6",
74 signature="ed25519:abc",
75 )
76 proposal = await _add_proposal(db_session, repo.repo_id, "mcp1")
77
78 # Must not raise — returns None or a tuple
79 result = await _extract_proposal_symbol_data(db_session, repo.repo_id, proposal.proposal_id)
80 # None is acceptable (no commits on from_branch linked to proposal yet)
81 assert result is None or isinstance(result, tuple)
File History 1 commit
sha256:a34090cc4a394a78bd72cbbe34b08cc59525141e19135b6c0ab154f10611b9ef debug(push/stream): instrument O-frame decode path with INF… Sonnet 4.6 patch 121 days ago