60 lines
2.3 KiB
Python
60 lines
2.3 KiB
Python
"""Regression tests for `enqueue_dream` metadata write shape.
|
|
|
|
Loop 4 (PR #573): `enqueue_dream` no longer touches collection.internal_metadata
|
|
at all. Both guard fields (last_dream_at and last_dream_document_count) are
|
|
written atomically in `process_dream` on successful completion — this preserves
|
|
the invariant that the baseline advances only when consolidation actually
|
|
happened, and prevents the in-flight stampede from false-advancing a guard.
|
|
"""
|
|
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
|
|
from src import schemas
|
|
from src.deriver.enqueue import enqueue_dream
|
|
|
|
|
|
class TestEnqueueDreamMetadataShape:
|
|
@pytest.mark.asyncio
|
|
async def test_enqueue_does_not_touch_collection_metadata(self):
|
|
"""`enqueue_dream` must not call update_collection_internal_metadata."""
|
|
with (
|
|
patch(
|
|
"src.deriver.enqueue.crud.update_collection_internal_metadata",
|
|
new_callable=AsyncMock,
|
|
) as mock_update,
|
|
patch(
|
|
"src.deriver.enqueue.crud.get_collection",
|
|
new_callable=AsyncMock,
|
|
) as mock_get_collection,
|
|
patch(
|
|
"src.deriver.enqueue.tracked_db",
|
|
) as mock_db_ctx,
|
|
):
|
|
mock_session = AsyncMock()
|
|
mock_session.scalar = AsyncMock(return_value=False)
|
|
mock_session.execute = AsyncMock()
|
|
mock_session.commit = AsyncMock()
|
|
mock_db_ctx.return_value.__aenter__.return_value = mock_session
|
|
|
|
await enqueue_dream(
|
|
workspace_name="test_workspace",
|
|
observer="alice",
|
|
observed="bob",
|
|
dream_type=schemas.DreamType.OMNI,
|
|
session_name=None,
|
|
)
|
|
|
|
assert not mock_update.called, (
|
|
"enqueue_dream must not write to collection.internal_metadata; "
|
|
"guard fields advance atomically in process_dream on success."
|
|
)
|
|
assert not mock_get_collection.called, (
|
|
"enqueue_dream must not need to load the collection — it no "
|
|
"longer touches dream metadata."
|
|
)
|
|
assert (
|
|
mock_session.execute.called
|
|
), "enqueue_dream must still insert the QueueItem row."
|