mirror of
https://github.com/calibrain/shelfmark.git
synced 2026-04-22 23:10:07 -04:00
- Adds a comprehensive multi-user request system to the existing download flow - Request configuration is policy based. Configure global settings for content type, or narrow down policy for specific sources (E.g. allow direct downloads, set prowlarr to request only, block IRC completely, etc). - Global policy configuration and per-user overrides for tailored configs - Replaced downloads sidebar with ActivitySidebar, combining active downloads with requests. Admin management of user requests is done here, and admins have view of downloads from all users. Sidebar can now be pinned. - Request either a standard book or a specific release. Release-requests are used if you permit one source differently than the other. On book-level requests, admins pick the specific file to be attached to the fulfilled request. - Users can request books with a note This is WIP so some features are still not complete (notifications, more automatic release selection, among others).
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""Tests for WebSocket room scoping and SID room synchronization."""
|
|
|
|
from shelfmark.api import websocket as websocket_module
|
|
from shelfmark.api.websocket import WebSocketManager
|
|
|
|
|
|
def test_join_user_room_without_db_user_id_does_not_join_admin_room(monkeypatch):
|
|
joined: list[tuple[str, str | None]] = []
|
|
|
|
monkeypatch.setattr(
|
|
websocket_module,
|
|
"join_room",
|
|
lambda room, sid=None: joined.append((room, sid)),
|
|
)
|
|
|
|
manager = WebSocketManager()
|
|
manager.join_user_room("sid-1", is_admin=False, db_user_id=None)
|
|
|
|
assert joined == []
|
|
assert manager._user_rooms == {}
|
|
|
|
|
|
def test_sync_user_room_moves_sid_between_rooms(monkeypatch):
|
|
joined: list[tuple[str, str | None]] = []
|
|
left: list[tuple[str, str | None]] = []
|
|
|
|
monkeypatch.setattr(
|
|
websocket_module,
|
|
"join_room",
|
|
lambda room, sid=None: joined.append((room, sid)),
|
|
)
|
|
monkeypatch.setattr(
|
|
websocket_module,
|
|
"leave_room",
|
|
lambda room, sid=None: left.append((room, sid)),
|
|
)
|
|
|
|
manager = WebSocketManager()
|
|
|
|
manager.sync_user_room("sid-1", is_admin=True, db_user_id=None)
|
|
assert joined == [("admins", "sid-1")]
|
|
assert left == []
|
|
assert manager._user_rooms == {}
|
|
|
|
manager.sync_user_room("sid-1", is_admin=False, db_user_id=42)
|
|
assert joined[-1] == ("user_42", "sid-1")
|
|
assert left[-1] == ("admins", "sid-1")
|
|
assert manager._user_rooms == {"user_42": 1}
|
|
|
|
manager.leave_user_room("sid-1")
|
|
assert left[-1] == ("user_42", "sid-1")
|
|
assert manager._user_rooms == {}
|
|
|
|
|
|
def test_sync_user_room_tracks_ref_counts_across_multiple_sids(monkeypatch):
|
|
monkeypatch.setattr(websocket_module, "join_room", lambda *_, **__: None)
|
|
monkeypatch.setattr(websocket_module, "leave_room", lambda *_, **__: None)
|
|
|
|
manager = WebSocketManager()
|
|
|
|
manager.sync_user_room("sid-a", is_admin=False, db_user_id=7)
|
|
manager.sync_user_room("sid-b", is_admin=False, db_user_id=7)
|
|
assert manager._user_rooms == {"user_7": 2}
|
|
|
|
manager.sync_user_room("sid-a", is_admin=False, db_user_id=8)
|
|
assert manager._user_rooms == {"user_7": 1, "user_8": 1}
|
|
|
|
manager.leave_user_room("sid-a")
|
|
manager.leave_user_room("sid-b")
|
|
assert manager._user_rooms == {}
|