"""Tests for the description-field roundtrip through the notes service. The description field is the user-stated goal/context on a task; distinct from `body` which (post-Task-as-Durable-Record) becomes the LLM-maintained consolidation summary. """ from unittest.mock import AsyncMock, MagicMock, patch def _mock_session_for_update(mock_note): mock_session = AsyncMock() mock_result = MagicMock() mock_result.scalars.return_value.first.return_value = mock_note mock_session.execute = AsyncMock(return_value=mock_result) mock_session.commit = AsyncMock() mock_session.refresh = AsyncMock() mock_session.__aenter__ = AsyncMock(return_value=mock_session) mock_session.__aexit__ = AsyncMock(return_value=False) return mock_session async def test_update_note_persists_description(): """update_note(description=...) should assign to note.description. update_note already accepts **fields and uses setattr, so this exercises that the new model column is reachable through the existing dynamic-fields path (no service-layer change required beyond the model column). """ mock_note = MagicMock() # Pre-existing state — None description, no recurrence, status untouched. mock_note.description = None mock_note.status = None mock_note.recurrence_rule = None mock_note.project_id = None with patch( "scribe.services.notes.async_session", return_value=_mock_session_for_update(mock_note), ): from scribe.services.notes import update_note await update_note(1, 1, description="the goal text") assert mock_note.description == "the goal text" async def test_create_note_forwards_description_to_model(): """create_note(description=...) should pass description into the Note constructor so it gets persisted alongside title/body/etc.""" captured: dict = {} class FakeNote: def __init__(self, **kw): captured.update(kw) self.id = 1 self.project_id = kw.get("project_id") for k, v in kw.items(): setattr(self, k, v) mock_session = AsyncMock() mock_session.add = MagicMock() mock_session.commit = AsyncMock() mock_session.refresh = AsyncMock() mock_session.__aenter__ = AsyncMock(return_value=mock_session) mock_session.__aexit__ = AsyncMock(return_value=False) with patch( "scribe.services.notes.async_session", return_value=mock_session ), patch("scribe.services.notes.Note", FakeNote): from scribe.services.notes import create_note await create_note( user_id=1, title="renew cert", description="the goal text", ) assert captured.get("description") == "the goal text"