"""Atomic proof: server_default columns are readable after flush() + refresh(). Reproduces the wall documented in /tmp/server_default_wall.md. SR1 default_branch is 'main' after flush + refresh (no explicit value passed) SR2 updated_at is a datetime after flush + refresh (no explicit value passed) SR3 created_at is a datetime after flush + refresh (no explicit value passed) """ from __future__ import annotations from datetime import datetime import pytest from sqlalchemy.ext.asyncio import AsyncSession from musehub.core.genesis import compute_identity_id, compute_repo_id from musehub.db.musehub_repo_models import MusehubRepo def _repo(owner: str = "test-owner") -> MusehubRepo: owner_id = compute_identity_id(owner.encode()) repo_id = compute_repo_id(owner_id, "test-repo", "code", "2026-01-01T00:00:00") return MusehubRepo( repo_id=repo_id, name="test-repo", owner=owner, slug="test-repo", visibility="public", owner_user_id=owner_id, domain_id="code", # default_branch, created_at, updated_at intentionally omitted ) async def test_SR1_default_branch_after_flush_refresh(db_session: AsyncSession) -> None: """SR1: default_branch == 'main' after flush + refresh without explicit value.""" repo = _repo("sr1-owner") db_session.add(repo) await db_session.flush() await db_session.refresh(repo) assert repo.default_branch == "main", ( f"Expected 'main', got {repo.default_branch!r}" ) async def test_SR2_updated_at_after_flush_refresh(db_session: AsyncSession) -> None: """SR2: updated_at is a non-None datetime after flush + refresh.""" repo = _repo("sr2-owner") db_session.add(repo) await db_session.flush() await db_session.refresh(repo) assert repo.updated_at is not None, "updated_at must not be None after flush + refresh" assert isinstance(repo.updated_at, datetime), ( f"updated_at must be a datetime, got {type(repo.updated_at)}" ) async def test_SR4_server_default_after_prior_commit(db_session: AsyncSession) -> None: """SR4: server_default works after a prior commit() on the same session.""" # Commit something first — mirrors the agent registration path. repo_a = _repo("sr4-owner-a") db_session.add(repo_a) await db_session.commit() repo_b = _repo("sr4-owner-b") db_session.add(repo_b) await db_session.flush() await db_session.refresh(repo_b) assert repo_b.default_branch == "main", ( f"Expected 'main' after prior commit, got {repo_b.default_branch!r}" ) assert repo_b.updated_at is not None, "updated_at must not be None after prior commit" async def test_SR3_created_at_after_flush_refresh(db_session: AsyncSession) -> None: """SR3: created_at is a non-None datetime after flush + refresh.""" repo = _repo("sr3-owner") db_session.add(repo) await db_session.flush() await db_session.refresh(repo) assert repo.created_at is not None, "created_at must not be None after flush + refresh" assert isinstance(repo.created_at, datetime), ( f"created_at must be a datetime, got {type(repo.created_at)}" )