DFiP_Budget_planing/api/tests/unit/test_websocket_connection_cache.py
Andrey Epifancev 4dae72da2b test(ws): кэш соединения - unit и интеграционный через websocket_connect
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:17:56 +04:00

75 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""AURORA-1845: user/форма читаются из БД один раз на соединение, а не на каждое сообщение."""
from types import SimpleNamespace
from unittest.mock import AsyncMock, MagicMock
import pytest
from src.api.v1.websocket import ConnectionCache, FormEventProcess
def _processor(user=None, form=object()):
proc = FormEventProcess(MagicMock())
proc.user_service = MagicMock(get=AsyncMock(return_value=user or SimpleNamespace(id=7, role_id=2)))
proc.bf_service = MagicMock(get=AsyncMock(return_value=form))
proc.sheet_service = MagicMock(update_cell=AsyncMock(return_value=[]))
return proc
EVENT = {"event": "cell_updated", "data": {"line_id": 1, "column": "c", "value": 1}}
async def _send(proc, cache, n):
for _ in range(n):
await proc.process(event_data=EVENT, form_id=5, user_id=7, sheet="S", cache=cache)
@pytest.mark.asyncio
async def test_cache_reads_user_and_form_once_per_connection():
proc = _processor()
cache = ConnectionCache()
await _send(proc, cache, 5)
assert proc.user_service.get.await_count == 1
assert proc.bf_service.get.await_count == 1
assert proc.sheet_service.update_cell.await_count == 5
@pytest.mark.asyncio
async def test_without_cache_reads_every_message():
proc = _processor()
await _send(proc, None, 3)
assert proc.user_service.get.await_count == 3
assert proc.bf_service.get.await_count == 3
@pytest.mark.asyncio
async def test_cache_expires_after_ttl():
now = [0.0]
cache = ConnectionCache(ttl=30, clock=lambda: now[0])
proc = _processor()
await _send(proc, cache, 2)
now[0] = 31
await _send(proc, cache, 2)
assert proc.user_service.get.await_count == 2
assert proc.bf_service.get.await_count == 2
@pytest.mark.asyncio
async def test_missing_form_is_not_cached():
proc = _processor(form=None)
cache = ConnectionCache()
for _ in range(3):
res = await proc.process(event_data=EVENT, form_id=5, user_id=7, sheet="S", cache=cache)
assert res is None
assert proc.bf_service.get.await_count == 3
proc.sheet_service.update_cell.assert_not_awaited()
@pytest.mark.asyncio
async def test_missing_user_is_not_cached():
proc = _processor()
proc.user_service.get = AsyncMock(return_value=None)
cache = ConnectionCache()
assert cache.get_user(7) is None
cache.set_user(None)
assert cache.get_user(7) is None