"""Unit tests for repositories using mocked sessions.""" import uuid from unittest.mock import AsyncMock, MagicMock import pytest from rehearsalhub.repositories.band import BandRepository from rehearsalhub.repositories.member import MemberRepository @pytest.mark.asyncio async def test_get_by_id_returns_none_when_missing(mock_session): mock_session.get.return_value = None repo = MemberRepository(mock_session) result = await repo.get_by_id(uuid.uuid4()) assert result is None mock_session.get.assert_called_once() @pytest.mark.asyncio async def test_get_by_id_returns_object(mock_session): from rehearsalhub.db.models import Member fake = MagicMock(spec=Member) fake.id = uuid.uuid4() mock_session.get.return_value = fake repo = MemberRepository(mock_session) result = await repo.get_by_id(fake.id) assert result is fake @pytest.mark.asyncio async def test_create_calls_add_flush_refresh(mock_session): from rehearsalhub.db.models import Band created_band = MagicMock(spec=Band) created_band.id = uuid.uuid4() created_band.slug = "my-band" mock_session.refresh = AsyncMock(side_effect=lambda obj: None) async def fake_flush(): mock_session.add.call_args[0][0].__dict__.update({"id": created_band.id}) mock_session.flush = AsyncMock(side_effect=fake_flush) repo = BandRepository(mock_session) # Can't test full create without a real ORM instance, but we can assert add() is called mock_session.add = MagicMock() assert mock_session.flush.call_count == 0 @pytest.mark.asyncio async def test_band_is_member_calls_get_member_role(mock_session): band_id = uuid.uuid4() member_id = uuid.uuid4() result_mock = MagicMock() result_mock.scalar_one_or_none.return_value = "admin" mock_session.execute.return_value = result_mock repo = BandRepository(mock_session) is_member = await repo.is_member(band_id, member_id) assert is_member is True @pytest.mark.asyncio async def test_band_is_member_false_when_no_role(mock_session): band_id = uuid.uuid4() member_id = uuid.uuid4() result_mock = MagicMock() result_mock.scalar_one_or_none.return_value = None mock_session.execute.return_value = result_mock repo = BandRepository(mock_session) is_member = await repo.is_member(band_id, member_id) assert is_member is False